东北大学数据结构期末复习ppt课件.ppt
《东北大学数据结构期末复习ppt课件.ppt》由会员分享,可在线阅读,更多相关《东北大学数据结构期末复习ppt课件.ppt(134页珍藏版)》请在三一办公上搜索。
1、期末复习,题型,选择题(10分)填空题(10分)算法应用题(算法填空,简单问题回答)(3-4个题,35-40分)算法设计(按照已知条件设计算法或为算法补充完整)(3个题,45-50分),第1章,算法的性质及其与程序的区别算法复杂性分析渐进意义下的四种记号简单的程序段的复杂度分析,算法的五个重要特征,输入 有零个或多个由外部提供的量作为算法的输入输出 算法产生至少一个量作为输出.确定性 组成算法的每条指令是清晰的,无歧义的.有限性 在执行了有穷步骤后运算终止可行性 运算都是基本运算,原理上能在有限时间内完成。,渐进意义下的记号:O,f(N)和g(N)是定义在正整数上的正函数定义1.1 如果存在两
2、个正常数c和N0,对于所有的NN0,有f(N) Cg(N),则记作:f(N)= O(g(N)。,N0,f(N),g(N),当说一个算法具有O(g(n)的计算时间时,指的就是如果此算法用n值不变的同一类数据在某台机器上运行时,所用的时间总是小于g(n)的一个常数倍。g(n)是计算时间f(n)的一个上界函数,f(n)的数量级就是g(n),符号的定义,定义1.2 如果存在两个正常数C和自然数N0,使得当N N0时有f(N)Cg(N),则称函数f(N)当N充分大时下有界;且g(N)是它的一个下界,记为f(N)=(g(N)。这时我们说f(N)的阶不低于g(N)的阶。, ,o 的定义, 定义f(N)= (
3、g(N)当且仅当f(N)=O(g(N)且f(N)=(g(N)。这时,我们说f(N)与g(N)同阶o 如果对于任意给定的0,都存在正整数N0,使得当N N0时有f(N)/g(N),则称函数f(N)当N充分大时的阶比g(N)低,记为f(N)=o(g(N)例如:4NlogN+7=o(3N2+4NlogN+7),1.2 算法分析初步,多项式时间算法(polynomial time algorithm):可用多项式来对其计算时间限界的算法O(1)O(logn)O(n)O(nlogn)O(n2)O(n3)指数时间算法(exponential time algorithm):计算时间用指数函数限界的算法O(
4、2n)O(n!)O(nn),作业1-7,第2章,递归分治法基本思想二分搜索算法Strassen矩阵乘法合并排序和快速排序,递归复杂度分析,汉诺塔移动次数,M(1)=1M(n)=2M(n-1)+1 = 22M(n-2)+1+1 = 22M(n-2)+2+1 = 23M(n-3)+22+2+1 = =2iM(n-i)+2i-1+2i-2+2+1 =2iM(n-i)+2i - 1令i= n -1 则M(n)= 2n-1 + 2n-1-1=2n-1,2.1 递归,分治法的基本思想,分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 把它分成两个或多个更小的问题; 分别解决每个小问
5、题; 把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。,例2-6 在9,12,15,27,39中分别查找27,12,14,mid = (left+right)/2=(0+4)/2=2,mid =(3+4)/2=3,查找27成功返回3,leftright,查找12成功返回1,left=right,查找14失败返回-1,leftright,template int BinarySearch( T a, const T /未找到x,n-1,0,left=right,(left+right)/2,middle+1,middle 1,当n1时,T
6、w(n)= Tw(n/2)+1, T(1) = 1Tw(n) = Tw(n/2) + 1 = Tw(n/4) +1 +1 =Tw(1)+1+.+1=1+k=1+logn,二分搜索的时间复杂度,最坏情况下的成功检索计算时间(logn) 最坏情况下的不成功检索计算时间(logn) 最好情况下的成功检索计算时间(1) 最好情况下的不成功检索计算时间(logn) 每种不成功的检索时间都为(logn),2.2二分搜索技术,作业:,P34,2-2 中第二个和第五个算法的正确性,错误的说明原因或者给出反例2. P35, 2-3,2-3:二分搜索中当程序停止时,左右指针或者指向同一个元素,此时该元素等于待查找
7、元素或者left=right+1,此时right指向的为比待找元素小的元素,left为比待找元素大的元素,归并排序主程序伪代码,templatevoid MergeSort(Type a , int left, int right)/ Aleft:right是一个全程数组,含有 right-left+1个待排序的元素。 if ( ) /至少有2个元素 int mid = (left+right)/2; /求当前数组的分割点 MergeSort(a,left, mid); MergeSort(a,mid+1, right); Merge(a,b,left, mid ,right); copy(a
8、,b,left,right); ,left right,递归调用,分别对分解出来的两个子问题排序,合并两个排好序的子问题,放入另一个数组b中,2.4合并排序,考虑数组a的两段为1, 7, 8, 9和2, 3, 4, 5,1,1,2,1,2,3,1,2,3,4,1,2,3,4,5,数组a的两部分,数组b,1,2,3,4,5,7,1,2,3,4,5,7,8,1,2,3,4,5, 7,8,9,在移动扫描指针的同时,要判断其是否已经到达数组的尾部,如到达,则停止扫描,把未参加排序的数全部放入备用数组中,2.4合并排序,合并函数,templatevoid Merge( Type a , Type b ,
9、 int l, int m, int r)/合并al:m和am+1:r到bl:r int i=l; j=m+1, k=l; while( ( ),把al:m和am+1:r中的数据进行比较,按顺序放入b中,如果前一段数据小于后一段的多,则先排完,把后段剩余数赋给bn,否则将前段数据赋给bn,前半段指针,后半段指针,数组b的下标指针,i=m,j=r,2.4合并排序,作业,分析merge函数最好与最坏的键值比较次数。,最好比较1次最差比较m+n-1,m和n分别为两段数组的长度,快速排序,Templatevoid QuickSort(Type a , int p,int r) if(pr) int q
10、=Partition(a,p,r); QuickSort(a,p,q-1);/对左半段排序 QuickSort(a,q+1,r);/对右半段排序 ,a的起始位置,A的终止位置,Partition函数负责将a进行一次分割,返回分割元素的位置,快速排序问题,划分程序,templateint Partition(Type a ,int p,int r) int i = , j = ; Type x = ; while( true ) while( a +i x ); if( ) break; Swap( a i , a j ); a p = ; a j = ; return j;,快速排序问题,p,
11、r+1,a p ,i = j,a j ,x,左侧扫描指针起始,右侧扫描指针起始,中轴元素,移动左侧扫描指针,移动右侧扫描指针,算法分析,最坏情况:划分的两个区域分别包含n1个元素和1个元素,如果每一步都出现这种情况,其复杂性T(n) O(1) n1 T(n)= T(n-1)+O(n) n1解得:T(n)=O(n2),快速排序问题,最好情况每次划分所取的基准都恰好为中值,即每次划分都产生两个大小为n/2的区域, O(1) n1 T(n)= 2T(n/2)+O(n) n1T(n)=O(nlogn),快速排序问题,2-19将算法Partition中的不等号反向,第3章,动态规划思想,基本要素矩阵连乘
12、算法及最优解构造0-1背包问题最优值及最优解最优二叉搜索树(通过具体实例弄清每个算法的流程及算法的具体实现),动态规划算法,将待求解的问题分解成若干个子问题,先求解子问题,并存储子问题的解而避免计算重复的子问题,再由子问题的解得到原问题的解。,算法思想,动态规划算法的基本要素,1 最优子结构性质2 重叠子问题性质,1. 最优子结构,当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。分析最优子结构性质时,一般假设由问题的最优解导出的子问题不是最优的,然后再设法说明在这个假设下可以构造出一个比原问题更优解更好的解,从而导出矛盾。,动态规划算法的基本要素,2.重叠子问题,在用递归算
13、法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法对每个问题只解一次,而后将其解保存在一个表格中,当再次需要解此问题时,用常数时间查看一下结果。因此,用动态规划算法通常只需要多项式时间。,动态规划算法的基本要素,动态规划与分治的联系区别,都是分解成子问题,由子问题的解得到原问题的解。分治中子问题相互独立,而动态规划中子问题互相有联系,且存在重复计算,即存在重叠子问题。,动态规划算法设计步骤,(1)找出最优解的性质,刻画其结构特征(2)递归地定义最优值(3)以自底向上的方式计算出最优值(4)根据计算最优值时得到的信息,构造一个最优解,矩阵连乘问题,给定n
14、个矩阵A1, A2, , An,其中Ai 是一个ri-1ri 矩阵( 1in),即AiAi+1是可乘的,求出n个矩阵相乘的最优计算次序,使得计算量最小。,问题提出,设三个矩阵A1, A2, A3大小分别为10100,1005,550,考虑(A1( A2 A3), (A1A2) A3的结果与相乘的次数。,最优子结构特征,计算A1:n的一个最优次序所包含的计算矩阵子链A1:k和Ak+1:n的次序也是最优的矩阵连乘积计算次序问题的最优解包含着其子问题的最优解,也就是最优子结构性质。,矩阵连乘问题,考虑A1:k 和Ak+1:n相乘所需的计算量,A i: k 和A k+1:j 相乘呢,A1:k 的结果为
15、r0*rk的矩阵,Ak+1:n的结果为rk*rn的矩阵,则它们相乘的计算量为p0*pk*pn,2.建立递归关系,设计算A i: j 所需的最少次数为mij,原问题的最优解为m1n。当 i = j 时,A i : j = Ai ,m i i = 0,i=1,2,n。 当 i j 时m i j =m i k + m k+1 j + pi-1pkpj k i, i+1, , j-1 ,矩阵连乘问题,采用递归方法计算,int RecurMatrixChain( int i, int, j, int p) if ( ) return 0; int u=RecurMatrixChain(i, i)+Rec
16、urMatrixChain(i+1,j,p) +pi-1*pi*pj; sij=i; for(int k=i+1; kj; k+) int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j,p) +pi-1*pi*pj; if (tu) u=t; sij=k; return u;,参加运算矩阵链起始位置,矩阵链终止位置,i=j,取第一个断开位置时计算量,记录当前断开位置,循环取k的可取断开位置,矩阵连乘问题,递归树,14,11,24,12,34,13,44,22,34,23,44,11,22,33,44,11,23,12,33,33,44,22,33
17、,22,33,11,22,矩阵连乘问题,24,22,34,12,33,44,11,14,13,23,矩阵连乘问题,3.计算最优值,3.计算最优值,置所有只有一个矩阵的矩阵链计算量为0,即mii=0, i=1,2,n。通过上一步的结果可以得到所有矩阵链长度为2的子问题的最优计算量。通过上两步的结果可以得到所有矩阵链长度为3的子问题的最优计算量 ,矩阵连乘问题,计算m i j 时,只用到已计算出的m i k 和m k+1 j ,A1 A2 A3 A4 A5 A6 3035 3515 155 510 1020 2025,例32,设要计算矩阵连乘积A1A2A3A4A5A6 ,其中各矩阵的维数分别为,1
18、 2 3 4 5 6,15750,2625,750,1000,5000,m11 + m23+p0p1p3=7875m13=min m12 + m33 + p0p2p3=15750,9375,11875,15125,4375,7125,10500,2500,5375,3500,7875,i,j,3.计算最优值,void MatrixChain(int p, int n, int * *m, int * *s) for (int i=1; i=n; i+) mii= ;/单个矩阵的计算量 for (int r=2; r=n; r+)/r为每次循环矩阵链的长度 for (int i=1; i= ;
19、i+) int j=i+r-1; mij= mi+1j+pi-1*pi*pj; sij=i; for (int k=i+1; kj; k+) int t= mik+ mk+1j+ ; if (t mij) mij=t; sij=k; ,矩阵连乘问题,0,n r + 1,取第一个可取位置,即断开位置为i,循环取k的可取位置,pi-1*pk*pj,算法复杂度,算法MatrixChain 的主要计算量取决于程序中对r, i 和k 的三重循环,循环体内的计算量为O(1),三重循环的总次数是O(n3),所以,算法的计算时间上界为O(n3)。,4. 构造最优解,上述算法只是明确给出了矩阵最优连乘次序所用的
20、数乘次数m1n,并未明确给出最优连乘次序,即完全加括号方法。但是以sij为元素的2 维数组却给出了足够的信息。事实上,sij=k说明,计算连乘积Ai:j的最佳方式应该在矩阵Ak 和Ak+1 之间断开,即最优加括号方式为(Ai:k)(Ak+1:j)。,1 2 3 4 5 60 1 1 3 3 3 0 2 3 3 3 0 3 3 3 0 4 5 0 5 0,考虑计算A16时的顺序,S16,(A1A3) (A4A6),S13,A1(A2A3),S46,(A4A5) A6,S11=0,S23=0,A1(A2)(A3),S22= S33= 0,S66=0,S45=0,(A4)(A5) A6,S44= S
21、55= 0,根据最优值算法构造最优解,Void Traceback(int i, int j, int * * s) if (i=j) return; Traceback(i, sij, s); Traceback(sij+1, j, s); cout “Multiply A” i “,” sij; cout “and A” (sij +1) “,” j; endl; ,调用Traceback(1, n, s)即可得到A1:n,作业 1 当A1 A2 A3 A4 A5 分别为2025, 2510,105,515,1520的矩阵时,填写相应的mij和sij,并给出最优计算次序。,备忘录方法,用一
22、个表格来保存已解决的子问题的答案,用的时候查表即可。采用的递归方式是自顶向下,动态规划是自低向上控制结构与直接递归相同,区别在于备忘录方式为每个解过的子问题建立备忘录。初始化为每个子问题的记录存入一个特殊的值,表示并未求解。在求解过程中,查看相应记录如果是特殊值,表示未求解,否则只要取出该子问题的解答即可。,动态规划算法的基本要素,备忘录方法解矩阵乘,int MemoizedMatrixChain(int n,int *m,int *s) for(int i=1;i=n;i+) for(int j=i;j=n;j+) mij=0; return LookupChain(1,n);,动态规划算法
23、的基本要素,int LookupChain(int i, int j) if(mij0) return mij; if(i=j) return 0; int u=LookupChain(i,i)+LookupChain(i+1,j) +pi-1*pk*pj; sij=i; for(int k=i+1;kj;k+) int t=LookupChain(i,k) +LookupChain(k+1,j) +pi-1*pk*pj; if(tu) u=t; sij=k; mij=u; return u;,动态规划算法的基本要素,表示该子问题已经求解,递归求解断开位置为i时的计算量,循环每个可取断开位置求
24、计算量,作业:请写出利用备忘录方法计算A1:4时都计算了哪些子问题,动态规划算法的基本要素,备忘录采用自顶向下的计算,将计算结果存入矩阵后返回,每个子问题仅在第一次被调用时计算。mij共有O(n2)个备忘记录项,初始化需要O(n2)时间,每个记录项只填入一次,共耗费O(n)时间,所以备忘录方法耗时O(n3)。,当一个问题的所有子问题都至少要解一次时,则用动态规划算法比备忘录方法好当子问题空间中的部分子问题可不必求解时,用备忘录方法则较有利,因为从其控制结构可以看出,该方法只解哪些确实需要求解的子问题。,动态规划算法的基本要素,0-1背包问题,给定n种物品和一背包。物品i的重量是wi0,其价值为
25、vi0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?,1. 最优子结构性质,证明0/1 背包问题具有最优子结构性质即若背包容量为c时,(y1, y2, yn )为待选物品为1到n时knap(1, n, c)的最优解,则(y2, yn )将是物品1作出选择后的子问题 的最优解,当第一个物品做出决策后,有两种状态 y1=0,则背包容量没有影响,(y2, yn )是 的最优解 y1=1,则背包减少w1,价值增长v1,(y2, yn )是 的最优解,x1,vixi,knap(2, n, c- w1*y1),knap(2, n,c),knap(2, n,c w1),2.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 数据结构 期末 复习 ppt 课件
链接地址:https://www.31ppt.com/p-1653274.html