Coursera - Algorithm (Stanford) - 课程笔记 - Week 4

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 TjXjc(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 TE[cnj(43)jXj]=cnj(43)jE[Xj]2cnj(43)j(几何级数求和 ∑ j ( 3 4 ) j ≤ 1 1 − 3 4 = 4 \sum_j (\frac 34)^j \le \frac 1{1 - \frac34} = 4 j(43)j1431=4
  • 最终 T ≤ 8 c n T \le 8 c_n T8cn

搜索的时间下界?

  • 是否存在比 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)=2mnk, m2nk
    • 则有 P r [ S 1 ] = k m ≤ 2 n Pr[S_1] = \frac km \le \frac 2n Pr[S1]=mkn2
    • 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](1n12)(1n2)
    • 整体上 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¬Sn2]=Pr[¬S1]Pr[¬S2¬S1]Pr[¬Sn2¬S1¬Sn3]n(n1)2n21
    • 有点小?不尽然,相比于暴力做法的指数型复杂度,这一做法的成功概率相对高了不少
  • 解决方案:重复尝试
    • 对RC算法重复多次(相互独立),取最佳最小割
    • 在尝试 N = n 2 N = n^2 N=n2次后,失败的概率 p ≤ 1 e p \le \frac 1e pe1
    • 在尝试 N = n 2 ln ⁡ n N = n^2 \ln n N=n2lnn次后,失败概率 p ≤ 1 n p \le \frac 1n pn1
    • 整体可以达到和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(n1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值