算法分析习题参考标准答案五.docxVIP

  • 9
  • 0
  • 约6.98千字
  • 约 10页
  • 2020-08-03 发布于天津
  • 举报
算法分析习题参考标准答案五 PAGE PAGE # 作者: 日期: PAGE PAGE # 1 ?最大子段和问题:给定整数序列 a1 ,a2, , an,求该序列形如 ak的子段和 k i 的最大值: max 0, max ak 1 i j n k i 已知一个简单算法如下: int Maxsum(i nt n ,i nt a,i nt best i,i nt bestj){ int sum = 0; for (int i=1;i=n;i++){ int suma = 0; for (int j=i;j=n;j++){ suma + = a[j]; if (suma sum){ sum = suma; besti = i; bestj = j; } } return sum; }试分析该算法的时间复杂性。 2)试用分治算法解最大子段和问题,并分析算法的时间复杂性。 3)试说明最大子段和问题具有最优子结构性质,并设计 个动态规划算法解最大子段和问题。分析算法的时间复杂度。 j (提示:令 b(j) “max ak, j 1,2,L ,n ) 1 i J n k i 解:1)分析按照第一章,列出步数统计表,计算可得 0(n2) 2)分治算法:将所给的序列a[1:n]分为两段a [1:n/2]、a[n/2+1:n],分别求出 这两段的最大子段和,则a[1: n]的最大子段和有三种可能: a[1:n]的最大子段和与a[1:n/2]的最大子段和相同; a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同; a[1: n]的最大子段和为两部分的字段和组成,即 j aj ai a n a n aj ; i i 2 2 1 intMaxSubSum ( int *a, int left , int right){ int sum =0; if( left==right) sum = a[left] 0? a[ left]:O ; else {int cen ter = ( left + right) /2; int leftsum =MaxSubSum ( a, left , center); int rightsum =MaxSubSum ( a, cen ter +1, right); int s_1 =0; int left_sum =0; for ( int i = cen ter ; i = left; i--){ left_sum + = a [ i ]; if( left_sum s1) s1 = left_sum; } int s2 =0; int right_sum =0; for ( int i = cen ter +1; i = right ; i++){ right_sum + = a[ i]; if( right_sum s2) s2 = right_sum; } sum = s1 + s2; if ( sum leftsum) sum = leftsum; if ( sum rightsum) sum = rightsum; } return sum; } int MaxSum2 (int n){ int a; returnMaxSubSum ( a, 1, n); }该算法所需的计算时间T(n)满足典型的分治算法递归分式 T(n)=2T(n/2)+O(n),分治算法的时间复杂度为0(nlogn) 3)设 b(j) max{ ak},贝U最大子段和为 max max ak max max ak maxb(j). 1 i j linljn 1jn 1 i j 1jn TOC \o 1-5 \h \z k i k i k i b( j) max{ ai a」1 a」,a? a」1 a」,,aj 1 aj, aj} 最大子段和实际就是max{b(1),b(2), ,b(n)}. 要说明最大子段和具有最优子结构性质,只要找到其前后步骤的迭代关系即可。 j j 1 j 1 aj,aj}b( j) max{ ak} maX { ak a,}, a,} maX max{ ak} a「 aj,aj} 1 i j k i k i 1 i j 1 k i 1 i j 1 若b(j 1) 0, b(j) b(j 1) aj ; 若b(j 1) 0,b(j) aj。 因此,计算b(j)的动态规划的公式为:b( j) max{ b( j 1) aj,aj}, 1 j n. intMaxSum (int* a,int n ) { int sum = 0, b = 0, j=0; for( int i=1;i=n ;i++) { if( b 0) b = b + a [i]; else b = a

文档评论(0)

1亿VIP精品文档

相关文档