Linear-Time Selection
- 问题
- 输入:一个n长度数组,每一个值均来自1到n之间的整数,且各不相同
- 输出:第i个顺序统计量
- 向排序问题规约(
O
(
n
log
n
)
O(n \log n)
O(nlogn))
- 使用归并排序
- 返回排序后的数组的第i个元素
- 线性随机化算法设集(数组A,长度n,顺序统计量i)
- 如果n为1,那么返回A[1](有且只有这一个统计量)
- 从n个数中,均匀随机抽取一个数字作为枢轴p
- 在枢轴p两侧进行划分,j为划分后p所在的位置
- 如果j恰为i,返回p
- 如果j大于i,递归调用(A左侧,j-1,i)
- 如果j大于i,递归调用(A右侧,n-j,i-j)
- 性质:这一随计选择的算法的平均运行时间为 O ( n ) O(n) O(n)
- 阶段:第j阶段时,数组长度在 ( 3 4 ) j n (\frac 34)^j n (43)jn和 ( 3 4 ) j + 1 n (\frac 34)^{j + 1} n (43)j+1n之间
- 该算法的运行时间受制于递归调用的次数: T ≤ ∑ j X j ⋅ c ⋅ ( 3 4 ) j n T \le \sum_j X_j \cdot c \cdot (\frac 34)^j n T≤∑jXj⋅c⋅(43)jn
- 随机选择产生25-75分割的枢轴的概率为
50
50%
50
- E [ X j ] ≤ 翻硬币翻到字朝上的期望次数 E[X_j] \le \text{翻硬币翻到字朝上的期望次数} E[Xj]≤翻硬币翻到字朝上的期望次数
- N为翻硬币反倒字朝上的次数 E [ N ] = 1 + 1 2 E [ N ] = 2 E[N] = 1 + \frac 12E[N] = 2 E[N]=1+21E[N]=2
- 因此 E [ X j ] ≤ E [ N ] E[X_j] \le E[N] E[Xj]≤E[N]
- T ≤ E [ c n ∑ j ( 3 4 ) j X j ] = c n ∑ j ( 3 4 ) j E [ X j ] ≤ 2 c n ∑ j ( 3 4 ) j T \le E[c_n \sum_j (\frac 34)^j X_j] = c_n \sum_j (\frac 34)^j E[X_j] \le 2c_n \sum_j (\frac 34)^j T≤E[cn∑j(43)jXj]=cn∑j(43)jE[Xj]≤2cn∑j(43)j(几何级数求和 ∑ j ( 3 4 ) j ≤ 1 1 − 3 4 = 4 \sum_j (\frac 34)^j \le \frac 1{1 - \frac34} = 4 ∑j(43)j≤1−431=4)
- 最终 T ≤ 8 c n T \le 8 c_n T≤8cn
搜索的时间下界?
- 是否存在比 O ( n log n ) O(n \log n) O(nlogn)更好的排序算法
- 定理:”任意一个基于比较的排序算法的时间下界均为 O ( n log n ) O(n \log n) O(nlogn)
- 对目标问题施加强假设(数据范围很小或线性于N等)可以将时间复杂度讲到线性时间(桶排序,计数排序,基数排序)
Graphs & The Contraction Algorithm
图
- 两个基本元素
- 顶点 / 节点 V
- 边 E,点对
- 可以为有向的(有序点对,即箭头)或者无向的(无序点对)
- 图的割Cut:对图的点集的划分,Cut(A,B)即将V划分成A和B的割(A和B要求非空)
- 交叉边:穿过割的边
- 对无向图,即端点分别在A和B的边
- 对有向图,指从A起始指向B的边
- 最小割问题
- 输入:一个无向图G(V,E),允许两点间有多条边
- 目标:计算一个有最少交叉边的割
- 一般情况下,使用n表示图中顶点个数,m为边的个数,其为
Ω
(
n
)
\Omega(n)
Ω(n)以及
O
(
n
)
\Omicron(n)
O(n)
- 对于一个”稀疏图“,一般指m接近 O ( n ) \Omicron(n) O(n)
- 对于一个”稠密图“,一般指m接近 O ( n 2 ) \Omicron(n^2) O(n2)
- 邻接矩阵:使用一个
n
×
n
n×n
n×n的矩阵
A
A
A表示图
G
G
G,其中
A
i
j
=
1
A_{ij} = 1
Aij=1表示ij之间有一条边
- 对含有平行边的图, A i j A_{ij} Aij表示ij之间边的个数
- 对带权边图, A i j A_{ij} Aij表示ij之间边的权重
- 对有向边, A i j = + 1 A_{ij} = +1 Aij=+1表示i到j存在一条边, A i j = − 1 A_{ij} = -1 Aij=−1表示j到i存在一条边
- 空间占用 θ ( n 2 ) \theta(n^2) θ(n2)
- 邻接列表:
- 保存顶点的数组或列表
- 保存边的数组或列表
- 每一条边指向其端点
- 每一个点指向发生于其的边(或者额外置一个存储,每一个点指向手术于其的边)
- 空间占用 θ ( m + n ) \theta(m + n) θ(m+n)
- 指定存储方式的选择:取决于图的稠密性以及需要的操作
最小割问题
- 随机收缩算法(Random Contraction):随机采样
- 当有超过两个顶点时:
- 均匀随机取一条剩下的边
(u, v)
- (收缩)将两个顶点u和v收缩为一个顶点
- 去除产生的自循环边
- 均匀随机取一条剩下的边
- 返回由最后的两个节点所代表的割(对应节点所代表的点集)
- 好像有时候这个算法不太行??
- 当有超过两个顶点时:
- 分析:上述随机收缩算法的成功几率是多少?
- 问题定义:对无向图G(V, E),寻找目标最小割(A, B),对应的交边集合为F
- 满足目标的迭代要求:当且仅当非F集合中的边被选中
- P r [ output is (A, B) ] = P r [ never contracts an edge of F ] Pr[\text{output is (A, B)}] = Pr[\text{never contracts an edge of F}] Pr[output is (A, B)]=Pr[never contracts an edge of F]
- 令
S
i
S_i
Si表示在第i次迭代时,压缩了F中的边的事件(导致算法出错的事件)
- 实质计算所有 S i S_i Si均不发生的概率
- P r [ S 1 ] = k m Pr[S_1] = \frac km Pr[S1]=mk,(k为(A,B)的交边个数,m为当前迭代下的边个数)目标:将问题结果的分析从不稳定衰减的m转移到稳定衰减(每一次迭代减1)的n上面
- 观察:每一个顶点的度至少为k(每一个顶点定义了一个割,k即以这个点为一个集合的割的交边个数)
- 则有 ∑ v d e g r e e ( v ) = 2 m ≥ n k , m ≥ n k 2 \sum_v degree(v) = 2m \ge nk ,\ m \ge \frac {nk} 2 ∑vdegree(v)=2m≥nk, m≥2nk
- 则有 P r [ S 1 ] = k m ≤ 2 n Pr[S_1] = \frac km \le \frac 2n Pr[S1]=mk≤n2
- P r [ ¬ S 1 ∩ ¬ S 2 ] = P r [ ¬ S 2 ∣ ¬ S 1 ] ⋅ P r [ ¬ S 1 ] ≥ ( 1 − 2 n − 1 ) ⋅ ( 1 − 2 n ) Pr[\neg S_1 \cap \neg S_2] = Pr[\neg S_2 | \neg S_1] \cdot Pr[\neg S_1] \ge (1 - \frac 2{n-1}) \cdot (1 - \frac 2n) Pr[¬S1∩¬S2]=Pr[¬S2∣¬S1]⋅Pr[¬S1]≥(1−n−12)⋅(1−n2)
- 整体上 P r [ ¬ S 1 ∩ ¬ S 2 ∩ … ∩ ¬ S n − 2 ] = P r [ ¬ S 1 ] P r [ ¬ S 2 ∣ ¬ S 1 ] … P r [ ¬ S n − 2 ∣ ¬ S 1 ∩ … ∩ ¬ S n − 3 ] ≥ 2 n ( n − 1 ) ≥ 1 n 2 Pr[\neg S_1 \cap \neg S_2 \cap \ldots \cap \neg S_{n - 2}] = Pr[\neg S_1] Pr[\neg S_2 | \neg S_1] \ldots Pr[\neg S_{n - 2} | \neg S_1 \cap \ldots \cap \neg S_{n - 3}] \ge \frac 2{n(n - 1)} \ge \frac 1{n^2} Pr[¬S1∩¬S2∩…∩¬Sn−2]=Pr[¬S1]Pr[¬S2∣¬S1]…Pr[¬Sn−2∣¬S1∩…∩¬Sn−3]≥n(n−1)2≥n21
- 有点小?不尽然,相比于暴力做法的指数型复杂度,这一做法的成功概率相对高了不少
- 解决方案:重复尝试
- 对RC算法重复多次(相互独立),取最佳最小割
- 在尝试 N = n 2 N = n^2 N=n2次后,失败的概率 p ≤ 1 e p \le \frac 1e p≤e1
- 在尝试 N = n 2 ln n N = n^2 \ln n N=n2lnn次后,失败概率 p ≤ 1 n p \le \frac 1n p≤n1
- 整体可以达到和n与m相关的多项式时间,但是仍然很慢( Ω ( n 2 m ) \Omega(n^2m) Ω(n2m))
- 计数最小割
- 一个图可能有超过一个最小割
- N节点图可能具有的最小割的最大数为 ( n 2 ) = n ( n − 1 ) 2 \binom{n}{2} = \frac{n(n - 1)}{2} (2n)=2n(n−1)