《高级算法设计与分析》光速复习
第 2 讲:复杂度的阶
\(A\) is \(O, o, \Omega, \omega, \Theta\) of B?
第 4 讲:哈希
装填因子 \(\alpha=\frac{n}{m}\),\(m\) 是槽的个数,\(n\) 是装填了元素的个数。
查找和插入操作的期望探测次数 \(\frac{1}{1-\alpha}\)。
第 5 讲:二叉搜索树(BST)
删除
无孩子:直接删除;
有一个孩子:直接跳过;
有两个孩子:找到它的后继(或者前驱)然后交换。
有右子树:后继是右子树的最左结点。
无右子树:后继是它最小的祖先,其左孩子也是它的祖先。
第 6 讲:红黑树
红黑树是满足如下性质的 BST,这些性质能保证它的高度在 \(O(\lg n)\)。
根结点是黑色的。
叶结点(NULL)是黑色的。
红色结点的子结点都是黑色的。
对于每个结点,从它到所有后代叶结点的路径上,黑色结点的个数都相同。这个个数称为「黑高」。
有 \(n\) 个内部结点红黑树的高度不会超过 \(2\lg(n+1)\)。
插入
先按 BST 的方法插入,并且把被插入的结点染成红色。这样只有可能破坏上述性质 3。
Case 1:新结点的叔结点是红色的,将父结点、叔结点染黑,然后祖父结点染红。如果祖父结点是根结点就不动它。
Case 3:新结点的叔结点是黑色的,新结点本身是左子结点,右旋。
Case 2:新结点的叔结点是黑色的,新结点本身是右子结点,先左旋转换为 Case 3。
第 7 讲:B 树
定义 B 树的最小度 \(t\)(\(t\geqslant 2\)):
至少 \((t-1)\) 个关键字,至多 \((2t-1)\) 个
至多 \(2t\) 个孩子
于是 \(t=2\) 的树,每个结点可以有 2、3、4 个孩子,称为 2-3-4 树。
结点分裂
当结点有 \((2t-1)\) 个关键字时,结点可以被分裂成两个有 \((t-1)\) 关键字的结点。例如,\(t=2\) 时:
+---+---+---+ +---+ +---+
| A | B | C | ==> | A | | C | (B 在上面)
+---+---+---+ +---+ +---+
V V V V V V V V
注意 \((2t-1)\) 本身是可以稳定存在的最大情况,分裂只会在插入时发生(见下)。
插入
如果待插入的结点本身已经 \((2t-1)\) 了,就要先把它分裂。例如 \(t=3\) 的 B 树如下,插入 Q:
因为结点 RSTUV 已经到 \((2t-1)\) 了,于是先把它分裂,然后再找地方插入 Q。
删除
(TBF)
第 8 讲:增强数据结构
第 13 讲:线性规划的单纯形法
例如,要最小化:
\[-2x_1+3x_2\]
满足
\[\begin{aligned} & x_1+x_2=7 \\ & x_1-2x_2\leqslant 4 \\ & x_1\geqslant 0 \end{aligned}\]
标准型
目标是最大化:将目标式取负得到 \(2x_1-3x_2\)
所有式子都是小于等于:将等式转换为两个式子,将大于等于式取负
有的变量没有非负约束:拆为两个非负变量 \(x'\) 和 \(x''\) 并替换为 \((x'-x'')\)。
于是变为
松弛型
目标还是最大化
用一系列新的变量代替原来的每个约束式,这些变量非负。
单纯形法
观察 Z,找到对它增长最大的元素(\(x_3\))
观察 \(x_4\) 至 \(x_6\),看哪个式子对 \(x_3\) 限制得最大。\(x_6\) 只允许 \(x_3\) 增长到 2,用它替换 \(x1\):
\[x_3=2-\frac{1}2x_1+x_2-\frac{1}2x_6 \]
代入,重复。
第 14 讲:FFT
没看懂,呜呜
第 15 讲:问题的困难性
P:可以在多项式时间内解决。
NP:可以在多项式时间内验证。
NP-Hard:比所有 NP 问题还难,可以由所有 NP 问题归约
NP-Complete:NP 且 NP-Hard