07 2012 档案
算法导论 CLRS 26.2-9 解答
摘要:算法如下: 从G中任取一点s,然后依次计算s到其他V-1个点的最大流,这V-1个最大流中的最小的那个流值|f|min就是要求的边连通度k证明: (1) 假设以t为汇点,最小割割(S,T), 容量为c(S,T)=|f|, 由于每条边的容留都是1,因此割(S,T)之间有c(S,T)条边相连,删除这c(S,T)条边,G一定会 变成非连通,因此k<=c(S,T)=|f|。 该不等式对任意一点为汇点都成立,因此k<=|f|min (2) 假设以t为汇点,最大流值为|f|, 我们要证明至少要删除|f|条边才会导致G中没有s-->t的路径: 由于最小割c(S,T)=|f|, 只...
阅读全文
算法导论 CLRS 25.2-3 解答
摘要:证明前驱子图Gπ,i是以i为根的一个最短路径树,需要依次证明如下性质:1. Gπ,i没有环路2.i到Gπ,i中任意顶点有且只有一条路径3. 证明该路径为最短路径性质1证明πi,j=k, 则di,j <= di,k + w(k,j), 假设存在环路c为(v0, v1, v2,...vk), vk=v0, 且是在更新vi的π值时第一次形成的环, π(vi)=vi-1,根据π的定义对于vi有di,vi < di,vi-1 + w(vi-1, vi)将k-1个不等式和上面的严格不等式相加得到 0 > w(v0, v1) + ... + v(vk, v0),和没有负权环路的前提矛盾性质
阅读全文
算法导论 CLRS 24.3-4 解答
摘要:先分析Dijkstra算法的本质要求:1. 有最优子结构2. 函数Len(s, v0, v1, ..., vk)定义了路径(s,v0, v1, ..., vk)的长度,要求任选一点vk+1属于V,则Len(s, v0, v1, ...,vk, vk+1) >=Len(s, v0, v1, ..., vk) 即以路径的角度来看Len是单调递增的;方法1:边的权重设置为w(u,v)=1/r[u,v], 求最短路径,路径长度的定义为Len(s, v0, ... ,vk) = w(s,v0)*w(v0,v1)*...*w(vk-1,vk), Len(s)=1; 松弛的时候使用乘法方法2:边的权重
阅读全文
算法导论 CLRS 24.1-5 解答
摘要:将所有d[v]初始化为0, 然后对边(u,v)松弛的时候,d[v] = min{ d[v], d[u]+weight(u,v) }可以证明δ*[v]同样满足三角不等式、上界性质、收敛性质和路径松弛性质
阅读全文
算法导论 CLRS 24.1-6 解答
摘要:Bellman-Ford进行VE次松弛之后,该负权环中必然有一个点不满足三角不等式,而且π[v]也在该环路中注意:上面的算法要求是只有一个负权环路,多个的话可能计算出的环路数可能小于实际值
阅读全文
算法导论 CLRS 24.1-4 解答
摘要:Bellman-Fort(G, w, s) 第七行替换为DFS-Mark(v)DFS-Mark(v)以v为定点进行深度遍历,将所有的点都标记为负无穷正确性证明:根据定理24.4的证明,可以推导出Bellman-Ford结束之后在所有负权环中必然有一个点v不满足三角不等式
阅读全文
算法导论 CLRS 23.3 解答 (未完成)
摘要:a) T为G的一个最小生成树,(u,v)为T中的任意一条边,可以证明(u,v)是G中所有u--->v的路径中的最小的边, 反正法:假设u--->v的某条路径P中存在一条边(x,y)的权重小于(u,v), T中存在u-->x, y-->v的路径,因此可以将(u,v)替换为(x,y),得到一个更小的树,显然和T为最小生成树矛盾 现在证明最小生成树也是瓶颈生成树 假设边(u,v)为最小生成树种的最大的边,权重为k;如果存在小于k的瓶颈生成树,则在该书中u--->v的路径上的所有的边权重小于k, 显然和上面的结论矛盾b) 遍历边,去掉所有大于b边,如果还是连通的则说明瓶颈
阅读全文
算法导论 CLRS 23.1-8 解答
摘要:假设最小生成树T和T'按照权重排序后的边为(e0, e1, ..)和(e0', e1', ....), 引入记号Ei和Ei',分别为T和T'的第0到第i条边的集合假设ek和ek'为第一对不是同一条边的位置,假设ek为边(u, v), ek'为(u', v')证明第一部分:在T'中必然有一条u--->v的路径,记为P'(u,v): 1. P'(u,v)不可能只包含Ek-1'中的边:因为k为第一对不同的边故Ek-1 = Ek-1',如果u--->v只有Ek-1'的边则
阅读全文
算法导论 CLRS 22.4-4 解答
摘要:先说结论: 对于有环图,top排序不一定可以生成坏边最小的序列证明:1. 假设G至少需要去掉k条边才能变成无环图,则任意序列P的坏边数目bad[P] >= k; 证明: 如果存在P使得bad[P] < k, 则只要去掉P中的坏边则剩下的必然为无环图,这个和假设矛盾 推论:存在序列P使得bad[P]=k,去掉k条边,然后top排序即可2. 对有环图进行拓扑排序得到的序列P, bad[P]和反向边数目相等 证明:有反向边定义可证3. 需要证明反向边数和k的关系,通过反例可证明反向边树可能大于k DFS之后的树为A-->B->C, 然后存在C->B, C->A两条
阅读全文
算法导论 CLRS 22.4-2 解答
摘要:拓扑排序,然后考虑子图G'(V', E') V' = { s | s属于V, 且在拓扑中p<=s<=v } E' = { (u,v) | (u,v)属于E, u,v属于V' }可证明任何原图G中p到v的路径必然在G'中, 然后用动态规划求路径数即可, 总的时间为O(V+E)
阅读全文
算法导论 CLRS 22.2-8 解答
摘要:1. 把无向图G转换为等价的有向图G', 原问题转换为求解有向图的欧拉路径问题,由于G’中的每个点入度等于出度,因此欧拉路径必然存在2. 按照1中求解欧拉路径的方法走迷宫即可
阅读全文
算法导论 CLRS 22.2-7 解答
摘要:使用分治法解决, 假设树的根为root, 则树的直径对应的路径P有如下三种情况1. P在左子树中,2. P在右子树中,3. P经过了根root,此时P必然为Lmax --> root --> Rmax, Lmax为左子树中深度最大的节点; 等价于左子树高度+右子树高度+1Diameter(N) = max{ Diameter(Left), Diameter(Right), Height(Left)+Height(Right)+1 }T(n) = 2T(n/2) + f(n)f(n)为计算第三种情况的时间, 我们可以先通过后序遍历计算出以每个节点的的高度,需要O(n), 此时f(n)
阅读全文
算法导论 CLRS 22.1-6 解答
摘要:从候选点中任意选择两个点u, v: 1. 如果存在u->v, 则u不可能为通用的汇 2. 如果不存在则v不可能是通用的汇每次选择都会去掉一个候选点,故需要选择V次, 可以使用链表来维护候选点,初始化需要O(V),每次选择前两个即可,每次选择以及删除候选点都可以在O(1)内完成;由于是邻接矩阵,可以在O(1)时间判断是否存在u->v; 总的时间为O(V)
阅读全文
算法导论 CLRS 22.1-4 解答
摘要:使用一个额外的数组A[V], 初始化为-1, 时间为O(V); 注意只需要一次初始化就可以遍历v的邻接表,每项a有三种情况: 1. 如果a == v, 说明为环,删除该项 2. A[a] != v,说明为第一条v->a的边,A[a]=v 3. A[a] == v, 删除总时间为O(E+V)网上直接搜到的一个解答要求邻接表内部列表是增序的,这个解答没有这个限制
阅读全文
算法导论 CLRS 19.2-10 解答
摘要:1. Extract-Min: 最小节点在Bmax中,删除需要O(lgN) Decrease-Key: 将Bmax中的一个叶节点降低为比Bmax的根还小,冒泡需要O(lgN) Delete: 同Extract-Min即可 Union: 合并的H'有lgN个二项树,总是要O(lgN)2. Insert: 当n为偶数的时候,插入总是只要O(1),不存在为O(lgN)的情况 Minimum: 当n为2的整数次幂时,min操作只要O(1),不存在为O(lgN)的情况
阅读全文
算法导论 CLRS 19.2-8 解答
摘要:假设二项堆H的第一个空缺的二项树为Bk, 则插入一个关键字x之后,必然是有B0, B1, .., Bk-1加上x组成Bk过程如下1. 遍历H的根表,同时比较x和各个二项树的根关键字,记录最小的关键字,直到空缺的二项树Bk2.如果最小关键字为某个二项树Bj的根,则将Bj的根替换为x,然后将x下沉;3. 以最小的关键字为根,B0, B1,...,Bk-1为孩子组成一个Bk
阅读全文
算法导论 CLRS 18.1 解答
摘要:a. n次写操作,每次需要2个IO操作(读取、写入)和 m CPU时间,故最坏IO数位 O(2n), CPU时间为O(n*m)b. n个Push操作需要 n/m 个IO操作, CPU时间为 O(n)c. 考虑如下序列 Push(with swap), Pop, Pop(with swap), Push, Push(with swap), 每两个操作导致一次交换,故最坏IO数为O(n), CPU时间为O(nm)d. 两个页的话每次需要读入新的页时,使用另一个页来交换,这样每次交换之后都是如下情况 当前位置为中间 | [......page1.......]...
阅读全文
算法导论 CLRS 17.3-5 解答
摘要:按照原有方式定义势函数,记为P, 根据公式17.4sum(ci) = sum(^ci) + P(D0)-P(Di) = 2n + b - P(Di) <= 2n + b = O(n)关键在于公式17.4(和17.3)直接由势函数和平摊代价定义推出,和势函数是否满足P(Di)>=P(D0)没有任何关系
阅读全文
算法导论 CLRS 5.3-5 解答
摘要:5.3-5 证明程序PERMUTE-BY-SORTING的数组P中,所有元素都唯一的概率至少为1 - 1/n。构造 1. 随机变量指示器 I(i, j) = 0 (P[i]!=P[j]) 或者 1 (P[i]=P[j]), P[i], P[j]为i, j分配的随机优先级,E[I(i, j)] = 1/n^3 2. 随机变量X为出现冲突优先级的对数E[X] = n(n-1)/2n^3根据马尔科夫不等式:Pr[X>=1] <= E[X]/1 = n(n-1)/2n^3 < 1/nPr[X==0] = 1-Pr[...
阅读全文
浙公网安备 33010602011771号