收藏 分享(赏)

《算法导论》复习大纲.doc

上传人:myw993772 文档编号:6327230 上传时间:2019-04-07 格式:DOC 页数:39 大小:1.28MB
下载 相关 举报
《算法导论》复习大纲.doc_第1页
第1页 / 共39页
《算法导论》复习大纲.doc_第2页
第2页 / 共39页
《算法导论》复习大纲.doc_第3页
第3页 / 共39页
《算法导论》复习大纲.doc_第4页
第4页 / 共39页
《算法导论》复习大纲.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、算法设计与分析复习提纲 2014.7.51 引言(ch1)1. 什么是算法及其特征算法(Algorithm)是通过一个有限的指令序列集合对特定问题进行求解的一种计算执行描述。算法特征:(1)输入:一个算法具有零个或多个取自指定集合的输入值;(2)输出:对每一次输入,算法具有一个或多个与输入值相联系的输出值;(3)确定性:算法的每一个指令步骤都是明确的;(4)有限性:对每一次输入,算法都必须在有限步骤(即有限时间)内结束;(5)正确性:对每一次输入,算法应产生出正确的输出值;(6)通用性:算法的执行过程可用于所有同类求解问题,而不仅适用于特殊输入。2.问题实例和问题规模问题实例是指需要计算同一个

2、结果的问题的所有输入。问题规模是指输入实例的大小,而输入实例是指问题的具体计算例子2 算法初步(ch2)1. 插入排序算法1)算法步骤:从左到右扫描数据 A,扫描到一个元素,将 Aj与其左边的元素从右到左依次比较,若比之小,则将其之前元素后移,插入 A【j】,直至 A【j】比他前面的元素大,扫描 A 中的下一个元素2)伪代码:InsertSort(A)for j=2 to A.length /第一层循环Key=Aji=j-1While i0 and aikey /第二层循环Ai+1=Aii=i-1Ai+1=key2.算法复杂性及其度量(1)时间复杂性和空间复杂性;(2)最坏、最好和平均情形复杂

3、性;顺序情况下 B(n)=O (n) 、倒序情况下 W(n)=O(n 2) 、A(n)=O(n 2), f(n)的阶小与 g(n)的阶2)渐进下界:0, f(n)的阶大与 g(n)的阶3)渐紧界:0, f(n) 的阶与 g(n)的阶相等2. 标准复杂性函数及其大小关系(1) 多项式时间阶的大小O(1) 证明2)对象限界最大最小项限界;几何级数限界;3)和式分解简单的一分为二;更复杂的划分;积分近似;4)Knuth 求和:使用数学归纳法;使用摄动法;使用递归;使用积分;使用二重求和;使用有限演算;使用母函数。4 递归关系式(ch4)1.替换法(1)猜测解 数学归纳法证明;T(n)=2T(n/2

4、)+n 猜:T(n)= O(nlogn)证: 2T(n/2)+n=1,b=1 整数Case1 f(n)= O(n logba-) = C n logba+ 且:af(n/b)= k2i,ki = k2i+1), (i = 1,2,3,4.n/2) 堆的性质和种类大根堆:除根结点外,所有结点小于其父结点;用于堆排序、收益问题。小根堆:除根结点外,父结点小于其所有结点;用于优先队列;成本问题; 堆的操作:建堆;整堆;1)整堆算法:假设 i 的左右子树已经是大根堆,对 i 结点进行整堆,使其也是大根堆对调整的子树结点循环进行上 2 步骤,将小元素逐级下沉,直至满足堆特性;整堆时间复杂度 O(log

5、n)2)整堆伪代码Max-heapify(A,i) l=left(i)r=right(i)if lAilargest=lelse largest=iif rAilargest=rif largest Apq-1Aqk) then 在右区间中继续找第 i-k 个元素;临界条件:当区间长度为 1 时,直接返回该元素RandomizedSelect(A, p, r, i) /选择 ith元素if p=r then return Ap; /临界问题处理qRandomizedPartition(A, p, r); /进行划分并返回划分元的下标kq-p+1; /Aq是第 k 个小的元素if i=k the

6、n /Aq是 ith元素return Aq;else if ik then /ith元素落在左区间return RandomizedSelect(A, p, q-1, i);else /ith元素落在右区间return RandomizedSelect(A, q+1, r, i-k);最好:每次划分为相等的左右区间 T(n)=T(n/2)+n = T(n)=(n)最坏:每次划分为不均等的左右区间 T(n)=T(n-1)+n = T(n)=(n 2)平均(期望):分析略。T(n)=(n)3.最坏时间为线性的选择算法及其时间分析算法步骤:While n1 dostep 1.将 n 个元素分成 5

7、个 1 组,共n/5 组。其中最后 1 组有 n mod 5 个元素。step 2.用插入排序对每组排序,取其中值。若最后 1 组有偶数个元素,取较小的中值。step 3 .递归地使用本算法找找n/5 个中值的中值 x。step 4.用 x 作为划分元对 A 数组进行划分,并设 x 是第 k 个最小元。step 5. if i=k then return x;else if i 左区间和右区间的最大长度7n/10+6运行时间递归式的建立step 1 2: O(1); step 3: T(n/5);step 4: O(n);step 5: 至多 T(7n/10+6)(n/5 向上取整)140)(

8、6107()5/(4) ifnnTifnT运行时间递归式的求解用替代法证:T( )n) cnT(n)c n/5+c(7n/10+6)+an /a 为常数c(n/5+1)+c(7n/10+6)+an= cn/5+c+7cn/10+6c+an= 9cn/10+7c+an= cn+(-cn/10+7c+an) cn /if -cn/10+7c+an0要使-cn/10+7c+an0,只要 c10an/(n-70)假定 n140, 有 n/(n-70)2取 c20a =-cn/10+7c+an0故 T(n)=O(n)9 红黑树(ch13)1.红黑树的定义和节点结构Def. 1: 红黑树是满足下述性质的二

9、叉搜索树每个节点必须为红色或黑色 每个节点必须为红色或黑色; /性质 1根为黑色; /性质 2树中的 nil 叶子为黑; /性质 3若节点为红,则其两个孩子必为黑; /性质 4每节点到其后代叶子的所有路径含有同样多的黑节点; /性质 5节点的结构Parentleft Corlor Key Right2.黑高概念Def. 2:节点 x 的黑高 bh(x)是该节点到它的任何后代叶子路径上的黑节点数(不包括 x 本身)Def. 3:红黑树的黑高是根的黑高,记 bh(rootT)3.一棵 n 个内点的红黑树的高度至多是 2log(n+1)先证对任何以 x 为根的子树其内节点数2 bh(x)-1归纳基础

10、:当 bh(x)=0 时,x 就是 nilT2 bh(x)-1= 20-1=0 即为 0 个内节点,正确归纳假设:对 x 的左右孩子命题正确归纳证明:x 的左右孩子的黑高或为 bh(x)或为 bh(x)-1x 的内点数=左孩子内点数+右孩子内点数+1(2 bh(x)-1-1)+(2bh(x)-1-1)+1= 2bh(x)-1 即第点得证。证明 bh(rootT)h/2, h 为红黑树的树高红点的孩子必为黑 /红黑树的性质 4红点的层数h/2因此 = bh(rootT)h/2证明最后结论红黑树有 n 个内点由 = n2 bh(rootT)-12 h/2-1 = h2log(n+1) 4.左旋算法

11、(略)步骤解释:需要变动的是 3 根粗链 临界情形yrightx /记录指向 y 节点的指针rightxlefty, pleftyx / 连到 x 右 =nilTpypx, px的左或右指针指向 y /y 连到 px Px=nilT, 即 x 为根Leftyx, pxy /x 连到 y 左注:-要注意先后顺序;-每条边的修改涉及双向;-要考虑临界情形(特殊情形);LeftRotate(T, x) /假定 rightx nilTy rightx; /step rightx lefty; plefty x; /step py p x; /step if px=nilT then /x 是根root

12、T y; /修改树指针else if x=leftpx then leftpx y; else rightpx y;lefty x; px y; /step T(n)=O(1)5.插入算法的时间、至多使用 2 次旋转step 1 :将 z 节点按 BST 树规则插入红黑树中,z 是叶子节点;step 2 :将 z 涂红;step 3 :调整使其满足红黑树的性质; RBInsert(T, z) y nilT; /y 用于记录:当前扫描节点的双亲节点x rootT; /从根开始扫描while x nilT do /查找插入位置 y x;if keyzkeyx then /z 插入 x 的左边x l

13、eftx;Elsex rightx; /z 插入 x 的右边pz y; /y 是 z 的双亲if y= nilT then /z 插入空树rootT z; /z 是根elseif keyzkeyy then lefty z; /z 是 y 的左子插入elserighty z; /z 是 y 的右子插入leftz rightz nilT;colorzred;RBInsertFixup(T, z);时间:T(n)=O(logn)调整算法的时间:O(logn);整个插入算法的时间:O(logn);调整算法中至多使用 2 个旋转RBInsertFixup(T, z) while ( colorpz=r

14、ed ) do /若 z 为根, ,则 pz=nilT,其颜色为黑,不进入此循环/若 pz为黑,无需调整,不进入此循环if pz=leftppz then /case 1,2,3 y rightppz; /y 是 z 的叔叔if colory=red then /case 1 colory=black; colorpz=black; colorppz=red; zppz;else /case 2 or case 3 y 为黑else /case 2 or case 3 y 为黑 if z=rightpz then /case 2 z pz; /上溯至双亲leftRotate(T, z);/以下

15、为 case 3 colorpz=black; colorppz=red;RightRotate(T ppz); RightRotate(T, ppz); /pz为黑, ,退出循环 /case 1s endif /case 2 or 3 s else /case 4,5,6s 与上面对称 /end whilecolorroott black;6.删除算法的时间、至多使用 3 次旋转RBDelete(T, z) if (leftz=nilT) or (rightz=nilT) then /case 1,2y z; /后面进行物理删除 yelse /z 的两子树均非空,case 3 y TreeS

16、uccessor(z); /y 是 z 的中序后继/此时,y 统一地是 x 的双亲节点且是要删除节点 的双亲节点且是要删除节点/ x 是待连接到 py的节点,以下要确定 xif lefty nilT then /本 if 语句综合了 case1,2,3 的 xx lefty;Elsex righty; /以下处理:用 x 取代 y 与 y 的双亲连接px py;if py=nilT then /y 是根rootT x; /根指针指向 xelse /y 非根if y=leftpy then /y 是双亲的左子leftpy x;elserightpy x;if yz then /case 3y 的

17、内容 copy 到 z;if colory=black thenRBDeleteFixup(T, x); /调整算法return y; /实际是删除 y 节点调整算法:RBDeleteFixup(T, x)讨论 x:或是 y 的唯一孩子;或是哨兵 nilT 可以想象将 y 的黑色涂到 x 上,于是-若 x 为红,只要将其涂黑,调整即可终止;-若 x 为黑,将 y 的黑色涂上之后,x 是一个双黑节点,违反性质 1。处理步骤如下:step 1:若 x 是根,直接移去多余一层黑色(树黑高减 1),终止;step 2:若 x 原为红,将 y 的黑色涂到 x 上,终止;step 3 :若 x 非根节点,

18、且为黑色,则 x 为双黑。通过变色、旋转使多余黑色向上传播,直到某个红色节点或传到根;RB-DELETE-FIXUP(T,x) /调整算法的时间:O(logn)ehile x != T.root and x.color = BLACKif x = x.p.leftw = x.p.rightif w.color = REDw.color=BLACKx.p.color=REDLEFT-ROTATE(T,x,p)w=x.p.rightif w.left.color = BLACK and w.right.color = BLACKw.color=REDx = x.pelse if w.right.c

19、olor = BLACKw.left.color = BLACKw.color = REDRIGHT-ROTATE(T,w)w = x.p.rightw.color = x.p.colorx.p.color = BLACKw.right.color = BLACKLEFT-ROTATE(T,x,p)x=T.rootelse(same as then clause with “right” and “left”exchanged)x.color = BlACK10 数据结构的扩张(ch14)1.动态顺序统计:扩展红黑树,支持选择问题(给定 Rank 求相应的元素),Rank 问题(求元素 x 在

20、集合中的 Rank)(1)节点结构的扩展;OS 树的定义:S(OrderStatistic)树是 棵红黑树在每个 OS(Order-Statistic)树是一棵红黑树在每个节点上扩充一个域 sizex而得到的,它是以 x 为根的子树中内部节点的总数(包括 x) 即子树大 根的子树中内部节点的总数(包括 x),即子树大小。节点结构:key/size(2)选择问题的算法;选择问题定义:在以 x 为根的子树中,查找第 i 个最小元素算法:OSSelect(x, i) (1): r sizeleftx+1;(2): 若 i=r 则返回 x (2): 若 i=r,则返回 x;若 ir,则递归地在 x 的

21、左子树中继续找第 i 个元素;若 ir,则递归地在 x 的右子树中继续找第 i-r 个元素;时间:O(logn)(3)Rank 问题的算法;求秩问题定义:OS 树中,给定元素 x 求其 rank算法:step 1: 在以 x 为根的子树中,x 的秩:r sizeleftx+1; r sizeleftx+1;step 2: 若 x 是根,则返回 r;若 x 是双亲的左子,则 x 在以 px为根的子树 若x 是双亲的左子,则 x 在以 px为根的子树中的秩是 r;若 x 是双亲的右子,则 x 在以 px为根的子树 p 中的秩是 r r+sezeleftpx+1;x 上移至 px;重复 直成立时 重

22、复,直至成立时终止;时间:O(logn)(4)维护树的成本分析;1)OS 树的维护: 插入算法Phase 1:从根向下插入新节点将搜索路径上所经 Phase 1:从根向下插入新节点,将搜索路径上所经历的每个节点的 size+1,新节点的 size 置为 1;-附加成本:O(logn) 附加成本:O(logn)Phase 2:采用变色和旋转方法,从叶子向上调整;-变色不改变 size; 变色不改变 size;-旋转可能改变 size:旋转是局部操作 旋转是局部操作,又,只有轴上的两个节点的 size 可能违反定义只需要在旋转操作后对违反节点 size 进行修改 只需要在旋转操作后,对违反节点 s

23、ize 进行修改-附加成本:旋转为 O(1),总成本为 O(logn)2)OS 树的维护: 删除算法Phase 1:物理上删除 y 在删除 y 时从 y 上溯至根将 Phase 1:物理上删除 y,在删除 y 时从 y 上溯至根,将所经历的节点的 size 均减 1;-附加成本:O(logn) 附加成本:O(logn)Phase 2:采用变色和旋转方法,从叶子向上调整;-变色不改变 size; 变色不改变 size;-旋转可能改变 size,至多有 3 个旋转;-附加成本:O(logn) -附加成本:O(logn)Remark:上面介绍的插入和删除均是有效维护有效,有效维护保证扩充前后的基本操

24、作的渐近时间不变。11 递归与分治法(sch1)1.递归设计技术递归的定义:若一个对象部分地包含它自己或用它自己给自己定 若一个对象部分地包含它自己, 或用它自己给自己定义 , 则称这个对象是递归的;若一个过程直接地或间接地调用自己则称这个过程是递归的过程。递归有两种:直接递归:自己调用自己;间接递归:A 调用 B,B 调用 A递归方法的三种应用:以下三个方面常用到递归方法1、 递归定义:如自然数定义:1 是自然数;-一个自然数加 1(后继)仍是自然数;注:“1 是自然数”是递归的临界条件2、递归的数据结构:如,单链表节点是递归扩展的3、问题的递归解法:如,汉诺塔问题的直观解法2.递归程序的非

25、递归化示例:n!的递归和非递归算法Fact1(n)/递归程序 Fact2(int n)/非递归程序 () 序 ()非序 if n=0 return 1; p=1;else return n*fact1(n-1); for i1 to n do pp*i; return p;Remark:(1)递归算法易设计和分析,但执行效率较低,常要转化非递归程序;(2)递归算法的非递归实现通常有三种实现方法:利用栈消除递归 利用迭代法消除递归;末尾递归消除法3.算法设计(1)Fibonacci 数; Fibonacci(n) /递归算法If n=0 or n =1 thenReturn n;Else Ret

26、urn Fibonacci(n-1) + Fibonacci(n-2)int fib(int n) / 非递归算法int a = 1, b = 1;if(n=0 | n=1) return n;for(int i=2; i1 :T(n)=n*T(n-1)+O(n) 得出 T(n)=O(n!),该算法是最优的(3)二分查找1) 基本思想:将有序序列(升序)等分为几乎相等的两部分,待查关键字与划分元比较。如果小于划分元,则递归处理左半部分,否则递归处理右半比较。非递归算法:Bi S h1(L ) /找到 x 返回下标值,找不到返回-1 left 1, rightn; flag 0; /flag 为

27、标志变量while (leftright and flag=0) do while (leftright and flag=0) do mid (left+right)/2;(此处有最小下界符号)if x=Lmid then flag1; if x=Lmid then flag1;else if xLmid then rightmid-1;else leftmid+1;if flag=1 then return mid;else return -1; 2) 递归算法:BinarySearch2(L ,x,i, j) y(,j) /在有序表 Lij中查找 xIf ij then return -

28、1;If i=j thenif x=Li then return i;else return -1;else mid (i+j)/2;/ (此处有最小下界符号)if x=Lmid then return mid;if x=Lmid then return mid;else if xLmid thenreturn BinarySearch2(L, x, i, mid-1);else return BinarySearch2(L, x, mid+1, j); 3) 递归算法时间分析N=1:T(n)=O(1);n1 :T(n)= T(n/2)+O(1) 得出 T(n)=O(logn)(4)大整数乘法

29、1) 普通递归乘法分析:X、Y 是 n 位的二进制数,设 X 是 n/2 位的 A+ n/2 位的B;Y 是 n/2 位的 C+ n/2 位的 D则 X=A2n/2+B, Y=C2n/2+D 则 XY=AC2n+(AD+BC) 2n/2+BD;其计算成本:T(n)=O(n 2)2) 改进的分治乘法:X=A2n/2+B, Y=C2n/2+D,则:XY =AC2n+(A-B)(D-C)+AC+BD)2n/2+BD,则 T(n)=O(nlog3)=O(n1.59)(5)Stranssen 矩阵乘法把 C=AB 写为 22 的分块矩阵令 P=(A11+A22 )(B11 +B22 ) ;Q=(A21+

30、A22)B11;R=A11(B12-B22) ;S=A22(B21-B11) T=(A11+A12)B22 U=(A21-A11)(B11+B12),V=(A12-A22)(B21+B22)则 C 11=P+S-T+V;C12=R+T ;C21=Q+S ; C22=P+R-Q+U时间分析:n=2:T(n)=O(1);n2:7T(n/2)+O(n 2)T(n)=O(nlog7)O(n 2.81)目前最好的计算时间上界是 O(n2.367),而最好下界仍是 (n 2)。12 动态规划(ch15)1.方法的基本思想和基本步骤动态规划的思想实质是分治思想和解决冗余。如果能够保存已解决的子问题的答案,在

31、需要时再查找,这样就可以避免重复计算、节省时间。动态规划法用一个表来记录所有已解的子问题的答案。这就是动态规划法的基本思路。具体的动态规划算法多种多样 具体的动态规划算法多种多样,但它们具有相同的填表方式。动态规划法的有效性依赖于问题本身所具有的两个重要的适用性质最优子结构和重叠子问题找出最优解的性质,并刻画其结构特征;递归地定义最优值(写出动态规划方程) ;以自底向上的方式计算出最优值;根据计算最优值时记录的信息,构造最优解。注:步骤是动态规划算法的基本步骤。如果只需要求出最优值的情形,步骤可以省略;若需要求出问题的一个最优解,则必须执行步骤,步骤中记录的信息是构造最优解的基础2.动态规划和

32、分治法求解问题的区别与分治法类似的是:将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是经分解的子问题往往不是互相独立的。若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。3.最优性原理及其问题满足最优性原理的证明方法例 1:设 G 是一个有向加权图,则 G 从顶点 i 到顶点 j 之间的最短路径问题满足最优性原理。证明:(反证)设 iipiqj 是一条最短路径,但其中子路径 ipiqj 不是最优的,假设最优的路径为 ipiqj则我们重新构造一条路径:iipiqj显然该路径长度小于 iipiqj,与 iipiqj是顶点 i 到顶点

33、j 的最短路径相矛盾.所以,原问题满足最优性原理。0-1 背包问题 Knap(1,n,c)满足最优性原理(证明略)最长路径问题不满足最优性原理(证明略)动态规划的设计技巧:阶段的划分、状态的表示和存储表的设计;问题的阶段划分和状态表示,需要具体问题具体分析,没有一个清晰明朗的方法;空间溢出的问题,是动态规划解决问题时一个普遍遇到的问题;4.算法设计(1)多段图规划;问题描述:多段图 G=(V, E)是一个有向图,且具有以下特征:(1)划为 k2 个不相交的集合 Vi, 1ik;(2) V1 和 Vk 分别只有一个结点 s(源点)和 t(汇点);(3)若E(G),uVi ,则 vVi1 1ik,

34、 边上成本 记 c(u,v);若E(G),边上成本记 c(u,v);求由 s 到 t 的最小成本路径。MultiStageGraph( G, k, n, p )/输入 n 个结点的 k 段图,假设顶点按段的顺序编号/E(G)是边集,p1k是最小成本路径new costn; /生成数组 cost, costj相当于前面的 cost(i,j)new dn; /生成数组 d, dj保存 vj 与下一阶段的最优连接点costn=0;for i=n-1 dwonto 1 do /计算 costi和 di costi=;while( 任意E(G) ) /r 是下一阶段中的顶点if(c(i,r)+costr

35、sum) sum=thissum;besti=i; bestj=j;return sum;注: 原算法:T(n)=O(n3);思考题:对 k 循环可以省略,改进后的算法: T(n)=O(n2);二、分治算法基本思想:将 A1n分为 a1n/2和 an/2+1n,分别对两区 段求最大子段和,这时有三种情形:Case 1:a1n的最大子段和的子段落在 a1n/2;Case 2:a1n的最大子段和的子段落在 an/2n;Case 3:a1n的最大子段和的子段跨在 a1n/2和 an/2n之间;对 C Case 1 和 C Case 2 可递归求解;对 Case 3,可知 an/2和 an/2+1一定

36、在最大和的子段中,因此在 a1n/2中计算 S1,在 an/2n中计算 S2,S1+S2 是 Case3 的最大值MaxSubSum2(a, left, right) /返回最大子段和sum=0;if( left=right )sum=aleft0?aleft:0;else center=(left+right)/2;leftsum=MaxSubSum2(a, left,center);rightsum=MaxSubSum2(a, center+1, right);s1=0; leftmidsum=0;for i=center to left do leftminsum += ai;if (l

37、eftmidsums1) thens1=leftmidsum;s2=0; rightmidsum=0;for i=center+1 to right do rightminsum += ai;if(rightmidsums2) thens2=rightmidsum;sum=s1+s2;if(sumsum) then sum=b;return sum;运行时间:T(n)=O(n)(4)最长公共子序列(LCS)LCS 最优解结构特征(step1)定义 X 的 ith 前缀:Xi=(x1,x2,xi),i=1mX0= 为空集Th15.1 (一个 LCS 的最优子结构)设序列 X=(x1,x2,xm)

38、和 Y=(y1,y2,yn),Z=(z1,z2,zk)是 X 和 Y 的任意一个LCS,则(1)若 xm=yn, = zk=xm=yn 且 Zk-1 是 Xm-1 和 Yn-1 的一个 LCS;(2)若 xmxm, = Z 是 Xm-1 1 和 Y 的一个 LCS;(3)若 xmyn, = Z 是 X 和 Yn-1 的一个 LCS;注:由此可见,2 个序列的最长公共子序列可由(1)(2)(3)算出,(2)(3)的解是对应子问题的最优解。因此,最长公共子序列问题具有最优子结构性质。证明:(1)若 xm=y yn, = zk=x xm=y yn 且 Zk k-1 1 是 Xm m-1 1 和 Yn

39、 n-1 1 的一个 LCS;(应用反证法)先证:zk=xm=yn。 若 zkyn) ,则将 xm 加到 Z 后,于是获得 X 和 y 的长度为 k+1 的 CS,与Z 是 X 和 Y 的 LCS 矛盾。 = zk=xm=yn再证:Zk-1 是 Xm-1 和 Yn-1 的一个 LCS。由 Z 的定义 = 前缀 Zk-1 是 Xm-1 和 Yn-1 的 CS(长度为 k-1)若 Zk-1 不是 Xm-1 和 Yn-1 的 LCS,则存在一个 Xm-1 和 Yn-1 的公生的公共子序列长度k k,与 Z 是 X 和 Y 的 LCS 矛盾。= Zk-1 是 Xm-1 和 Yn-1 的一个 LCS(2

40、)若 xmxm, = Z 是 Xm-1 和 Y 的一个 LCS; zkk 的 CS 序列 W,显然,W 也是 X 和 Y 的 CS,但其长度k k,矛盾。(3)若 xmyn, = Z 是 X 和 Yn-1 的一个 LCS;( (3) )与(2)对称,类似可证。综上,定理 15.1 证毕。 子问题的递归解(step2)定理 15.1 将 X 和 Y 的 LCS 分解为:(1)if xm=yn then /解一个子问题找 Xm-1 和 Yn-1 的 LCS;(2)if xm=ci, j-1 then ci, jci-1, j; bi, j “”; /由 Xi-1 和Yj 确定else ci, jc

41、i, j-1; bi, j “”; /由 Xi 和 Yj-1确定return b and c; 时间:(mn)构造一个 LCS(step4)Print_LCS(b, X, i, j) if i=0 or j=0 then return;if bi,j=“” then Print_LCS(b, X, i-1, j-1);print xi;elseif bi,j=“” then Print_LCS(b, X, i-1, j);else Print_LCS(b, X, i, j-1);时间:(m+n)13 贪心算法(ch16)1.方法的基本思想和基本步骤(1)贪心法的基本思想 贪心算法是根据一种贪心

42、准则(greedy criterion)来逐步构造问题的解的方法。在每一个阶段,都作出了相对该准则最优的决策。决策一旦作出,就不可更改。由贪心法得到的问题的解可能是最优解,也可能只是近似解。能否产生问题的最优解需要加以证明。所选的贪心准则不同,则得到的贪心算法不同,贪心解的质量当然也不同。因此,贪心算法的好坏关键在于正确的选择贪心准则。(2)设计贪心算法的基本步骤(1)选定合适的贪心选择的标准;(2)证明在此标准下该问题具有贪心选择性质;(3)证明该问题具有最优子结构性质;(4)根据贪心选择的标准,写出贪心选择的算法,求得最优解。2.贪心算法的正确性保证:满足贪心选择性质贪心选择性质:可通过局

43、部最优(贪心)选择达到全局最优解。-通常以自顶向下的方式进行,每次选择后将问题转化为规模最小的子问题;-该性质是贪心法使用成功的保障,否则得到的是近优解3.贪心算法与动态规划的比较(1)相同点:动态规划算法和贪心算法都属于递推算法,并且这两个算法适用的问题都具有最优子结构,都利用局部最优解来推导全局最优解。(2)不同点:动态规划算法和贪心算法有一个显著区别:1)在动态规划算法中,以自底向上的方式来利用最优子结构,也就是说,首先找到子问题的最优解,解决子问题,然后找到问题的一个最优解。2)在贪心算法中,以自顶向下的方式使用最优子结构,也就是说,贪心算法会先做出选择,在当时看起来是最优的选择,然后

44、再求解一个结果子问题,而不是先求解子问题的最优解,然后再做出选择。两者的不同点:1 贪心算法作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2 动态规划算法的全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有局部最优解;4.两种背包问题的最优性分析:最优子结构性质和贪心选择性质1)贪心选择性质:可通过局部最优(贪心)选择达到全局最优解。-通常以自顶向下的方式进行,每次选择后将问题转化为规模最小的子问题;-该性质是贪心法使用成功的保障,否则得到的是近优解2)最优子结构性质:问题的最优解包含它的

45、子问题的最优解-并不是所有具有最优子结构性质的问题都可以采用贪心策略-往往可以利用最优子结构性质来证明贪心选择性质。5.算法设计(1)小数背包; 允许将小数表示的物品放入背包中的是小数背包问题。举例来说,如果物品是原油、飞机燃料、煤油而你的背包是一只水桶,取0.473升的原油,0,263升的飞机燃料和0,264升的煤油 就 是 有 意义 的 。 这 是 形 式 最 简 单 的 要 解 决 的 背 包 问 题 。小数背包问题是三者中最简单的,其贪婪解法如下: 找到“值密度” ( 物 品 值 /尺寸)最大的物品 如 果 总 容 量 仍 就 超 过 物 品 的 可 利 用 率 ,把所有满足条件的物品

46、放入背包中,然后反复执行。 如果总容量少于物品的可利用率,尽可能多的使用可用空间,然后终止。 由于这个算法必须先按照值密度把物品分类,然后以降序将它们放入背包,直至容量用完, 该算法以 N log N 级运行。通常简单些的方法不是将它们分类,而是不停地找每次不用的最大值密度,这种算法的时间复杂度是 O(N2) 问题:求一定背包容量情况下,装入价值最多的东西Wi:重量 vi:价值 Vi/Wi :价值率(单位重量价值)GreedyKnapsack(n,M,w,w,x)/按价值率最大贪心Sort(n,v,w);/使 V1/W1=V2/W2=.=Vn/wnFor i=1 to n do xi=0;c=M;For i=1 to n do If(wic) break;Xi=1; c- = wi;If(ivoid GreedySelector(int n, Type s, Type f, bool A)/各活动的起始和结束时间存储于数组 s 和 f 中,且按结束时间的非减序排列A1=true;int j=1;for (int i=2;i=fj) Ai=true; j=i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报