空间复杂度:

定义:

一般情况下,一个程序在机器上执行时,除了需要寄存器本身所用的指令,常数,变量和输入数据外,还需要一些对数据进行操作的辅助空间。

辅助空间与算法的功能无关:

  • 不被称为辅助空间:
    1. 作为输入参数的空间
    2. 作为输出参数的空间
  • 被称为辅助空间:
    1. 如果流程需要开辟空间才能让流程继续下去,该空间被称为辅助空间。

链表:

对首元结点,头结点,头指针的声明:

  • 首元结点:链表中存储第一个数据的结点。
  • 头节点:在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息。
  • 头指针:指向链表中第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设头结点,则头指针所指结点为该线性表的首元结点。

堆结构:

  • 堆结构就是用数组实现的完全二叉树结构。
  • 完全二叉树中如果每棵子树的最大值都是在堆顶就是大根堆。
  • 完全二叉树中如果每棵子树的最小值都是在堆顶就是小根堆。

核心操作:

  1. 插入元素(上浮调整)
  • 步骤:
    1. 将新元素插入数组末尾。
    2. 向上调整:若新元素大于父节点(最大堆),与其交换,知道满足堆性质。
  • 时间复杂度:O(log n)
  1. 删除堆顶元素(下沉调整)
  • 步骤:
    1. 移除堆顶元素,将数组末尾元素移至堆顶。
    2. 向下调整:将当前节点与较大子节点(最大堆)比较,若小于则交换,知道满足堆性质。
  • 时间复杂度:O(log n)
  1. 构建堆
  • 自底向上法:从最后一个非叶子节点(下标为n/2-1)开始,向前遍历并对每个节点执行下沉操作。

  • 时间复杂度:O(n)

哈希表

  • 散列查找法:通过对元素的关键字值进行某种运算,直接求出元素的地址,即使用关键字到地址的直接转换方法,而不需要反复比较,因此,散列查找法又叫杂凑法或散列法。

  • 散列函数和散列地址:在记录的存储位置p和其关键字key之间建立一个确定的对应关系H,使p=H(key),称这个对应关系H为散列函数,P为散列函数地址。

  • 哈希表(散列表):一个有限连续的地址空间,用以存储按散列函数计算得到相应散列地址的数据记录。通常散列表的存储空间是一个一维数组,散列地址是数组的下标。

  • 冲突和同义词:对不同的关键字可能得到同一散列地址,即key1不等于key2,而H(key1) 等于 H(key2),这种现象称为冲突,具有相同函数值的关键字对该散列函数来说称作同义词,key1,key2互称为同义词。

使用链表可以解决哈希冲突。

图:

图的存储结构 -- 邻接表(链式存储)

邻接表是图的一种链式存储结构。在邻接表中,对图中每个顶点vi建立一个单链表,把与vi相邻接的顶点放在这个链表中。邻接表中每个单链表的第一个结点存放有关顶点的信息,把这一结点看成链表的表头,其余结点存放有关边的信息,这样的邻接表便由两部分组成: 表头结点和边表。

  • 表头结点:由所有表头结点以顺序结构的形式存储,以便可以随机访问任一顶点的边链表。表头结点包括数据域和链域两部分。链域指向与顶点vi邻接的第一个邻接点。
  • 边表:由表示图中顶点间关系的2n个边链表组成。边链表中边结点包括邻接点域,数据域,链域,邻接点域指示与顶点vi邻接的点在图中的位置;数据域存储与边相关的信息;链域指示与顶点vi邻接的下一条边的结点。

前缀编码

任何一个字符的编码都不是同一字符集中另一字符编码的前缀;哈夫曼编码是最优前缀编码。

连通图

如果对于无向图G中的任意两个属于顶点集V的顶点V1,V2;V1,V2都是连通的,则称G是连通图。

重(双)连通图和关节点

若从一个连通图中删去任何一个顶点及其相关联的边,它仍为一个连通图的话,则该连通图被称为重(双)连通图。

若连通图中的某个顶点和其相关联的边被删除之后,该连通图被分割成两个或两个以上的连通分量,则称此顶点为关节点。

没有关节点的连通图为双连通图 alt

广义表:

定义:

广义表是线性表的推广,也成为列表;广义表的定义是一个递归的定义。

长度与深度

广义表的长度定义为最外层包含元素的个数 广义表的深度定义为所含括号的重(层)数;广义表的深度=MAX{子表的深度}+1

取表头表尾

取表头:取出的表头为非空广义表的第一个元素,它可以是一个单元素,也可以是一个子表;

取表尾:取出的表尾为除去表头之外,由其余元素构成的表。即表尾一定是一个广义表。