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

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

作者:日期:

1 •最大子段和问题:给定整数序列a1 ,a2, , a n,求该序列形如a k的子段和

k i

的最大值:max 0, max a k

1 i j n

k i

1) 已知一个简单算法如下:

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 a k, 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

a j a i a n a n a j ;

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{ a k},贝U最大子段和为max max a k max max a k

maxb(j).

1 i j linljn 1jn 1 i j 1jn

k i k i k i

b( j) max{ a i a」1 a」,a? a」1 a」,,a j 1 a j, a j}

最大子段和实际就是max{b(1),b(2), ,b(n)}.

要说明最大子段和具有最优子结构性质,只要找到其前后步骤的迭代关系即可。

j j 1 j 1

b( j) max{ a k} maX { a k a,}, a,} maX max{ a k} a「a j} maX b(j 1)

a j,a j}

1 i j

k i k i 1 i j 1k i

1 i j 1

若b(j 1) 0, b(j) b(j 1) a j ;

若b(j 1) 0,b(j) a j。

因此,计算b(j)的动态规划的公式为:b( j) max{ b( j 1) a j,a j}, 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 [i];

en d{if}

if( b > sum)

sum = b;

j=i ;

en d{if}

}

return sum;

}

自行推导,答案:时间复杂度为O (n)

相关文档
最新文档