以 L O C ( a 1 ) LOC(a_1) LOC(a1) 表示线性表中第一个元素的存储位置,在 顺序存储结构 中,第 i i i 个元素 a i a_i ai 的存储位置为
L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) × L LOC(a_i)=LOC(a_1)+(i-1) \times L LOC(ai)=LOC(a1)+(i−1)×L
其中, L L L 是表中每个数据元素所占空间的字节数。根据该计算关系,可随机存取表中的任一个元素。
设每个数据元素占用 L L L 个单元, m m m、 n n n 为数组的行数和列数, L o c ( a 11 ) Loc(a_{11}) Loc(a11) 表示元素 a 11 a_{11} a11 的地址,那么以行为主序优先存储的地址计算公式为:
L o c ( a i j ) = L o c ( a 11 ) + ( ( i -- 1 ) × n + ( j − 1 ) ) × L Loc(a_{ij}) = Loc(a_{11})+((i --1)\times n+(j−1)) \times L Loc(aij)=Loc(a11)+((i--1)×n+(j−1))×L
同理,以列为主序优先存储的地址计算公式为:
L o c ( a i j ) = L o c ( a 11 ) + ( ( j − 1 ) × m + ( i − 1 ) ) × L Loc(a_{ij}) = Loc(a_{11})+((j −1) \times m+(i -1))\times L Loc(aij)=Loc(a11)+((j−1)×m+(i−1))×L
推广至多维数组,在按下标顺序存储时,先排最右的下标,从右向左直到最左下标,而逆下标顺序则正好相反。
树 ------ 树根为第一层,最大层数为树高/深度,度
结点的层次 。根为第一层,根的孩子为第二层,依此类推,若某结点在第 i 层,则其孩子结点在第 i+1 层。例如,图中,A 在第 1 层,B、C、D 在第 2 层,E、F 和 G 在第 3 层。
设有字符集 {a,b,c,d,e} 及对应的权值集合 {0.30,0.25,0.15,0.22,0.08},按照构造最优二叉树的哈夫曼方法:先 按权值从低到高 ,先取字符 c 和所 e 对应的结点构造一棵二叉树(根结点的权值为 c 和 e 的权值之和),然后与 d 对应的结点分别作为左、右子树构造二叉树,之后选 a 和 b 所对应的结点作为左、右子树构造二叉树,最后得到的最优二叉树(哈夫曼树)如图所示。
普里姆算法 构造最小生成树的过程是 以一个顶点集合 U = u 0 U={u_0} U=u0 作为初态,不断寻找与 U U U 中顶点相邻且代价最小的边的另一个顶点,扩充 U U U 集合直到 U = V U=V U=V 时为止 。 克鲁斯卡尔求最小生成树的算法思想为 :假设连通网 N = ( V , E ) N=(V,E) N=(V,E),令最小生成树的初始状态为只有 n n n 个顶点而无边的非连通图 T = ( V , { } ) T=(V,\{\}) T=(V,{}),图中每个顶点自成一个连通分量。在 E E E 中选择代价最小的边,若该边依附的顶点落在 T T T 中不同的连通分量上,则将此边加入到 T T T 中,否则舍去此边而选择下一条代价最小的边 。依此类推,直到 T T T 中所有顶点都在同一连通分量上为止。
在理想情况下,如果每次划分都恰好选择当前子数组的 真中位数 作为枢轴,那么快速排序就能保证 完全平衡 的递归分治:每次将规模为 n n n 的问题分解为两个规模为 n / 2 n/2 n/2 的子问题,再加上一次 O ( n ) O(n) O(n) 的划分工作。递归关系和时间复杂度:
T ( n ) = 2 T ( n 2 ) + O ( n ) ⟹ T ( n ) = O ( n log n ) . T(n) \;=\; 2\,T\bigl(\tfrac n2\bigr)\;+\;O(n) \quad\Longrightarrow\quad T(n)=O(n\log n). T(n)=2T(2n)+O(n)⟹T(n)=O(nlogn).
快速排序的空间复杂度:快速排序在变量(如基准值、索引和用于交换的临时变量)上使用恒定的额外空间 O ( 1 ) O(1) O(1),每次递归调用都会消耗栈空间,每层调用保存 O ( 1 ) O(1) O(1) 变量。
在平衡划分的情况下,递归深度为 O ( l o g n ) O(log\ n) O(log n),即 平均空间复杂度为 O ( l o g n ) O(log\ n) O(log n);
在不平衡划分的情况下,递归深度可以达到 n n n,即 最坏空间复杂度为 O ( n ) O(n) O(n)。
对 A 进行简单选择排序时,第一趟需交换 21 和 17,导致 21 与 21* 的相对位置发生变化。
对于 A, B 选项,以 A 为例, a 1 , a 2 . . . , a n a_1, a_2 ..., a_n a1,a2...,an 均比 b 1 b_1 b1 小,那么它们各自与 b 1 b_1 b1 比较一次即可,剩下有序数组 B 不需要比较直拼接到 a n a_n an 后即可。共需 n n n 次比较。
同理 D 选项的 b i / 2 + 1 b_{i/2+1} bi/2+1 到 b n b_n bn 都不需要比较直接拼接。
对于 C 选项, a 1 a_1 a1 和 b 1 b_1 b1 比较 a 1 a_1 a1 小,然后 a 2 a_2 a2 和 b 1 b_1 b1 比较 b 1 b_1 b1 小,继续 a 2 a_2 a2 和 b 2 b_2 b2 比较 a 2 a_2 a2 小,继续。。。