- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]数据结构经典题型
数据结构 杨旸 最大子序列问题 给定整数A1, A2, A3, A4..,An,求其中的最大子序列(为方便起见,如果所有整数为负数,则最大子序列为负数) 第一种算法 求出所有子序列的所有可能的组成,然后计算出最大子序列 int MaxSubsequenceSum (int A[ ], int N ) { int ThisSum, MaxSum, i, j, k; /* 1*/ MaxSum = 0; /* initialize the maximum sum */ /* 2*/ for( i = 0; i N; i++ ) /* start from A[ i ] */ /* 3*/ for( j = i; j N; j++ ) { /* end at A[ j ] */ /* 4*/ ThisSum = 0; /* 5*/ for( k = i; k = j; k++ ) /* 6*/ ThisSum += A[ k ]; /* sum from A[ i ] to A[ j ] */ /* 7*/ if ( ThisSum MaxSum ) /* 8*/ MaxSum = ThisSum; /* update max sum */ } /* end for-j and for-i */ /* 9*/ return MaxSum; } 第二种算法 减少了一个循环 int MaxSubsequenceSum (int A[ ], int N ) { int ThisSum, MaxSum, i, j; /* 1*/ MaxSum = 0; /* initialize the maximum sum */ /* 2*/ for( i = 0; i N; i++ ) { /* start from A[ i ] */ /* 3*/ ThisSum = 0; /* 4*/ for( j = i; j N; j++ ) { /* end at A[ j ] */ /* 5*/ ThisSum += A[ j ]; /* sum from A[ i ] to A[ j ] */ /* 6*/ if ( ThisSum MaxSum ) /* 7*/ MaxSum = ThisSum; /* update max sum */ } /* end for-j */ } /* end for-i */ /* 8*/ return MaxSum; } 第三种算法 利用分治思想递归之 我们的最大子序列可能出现在三处地方,或者前半部分,或者后半部分,或者跨越中部的部分 4 -3 5 -2 -1 2 6 -2 前半部分最大为6,后半部分为8,跨越中间的部分为6-2-1+8=11,因此中间为最大的子序列 Int MaxSubSum(int A[],int left,int right) { int MaxLeftSum, MaxRightSum; int MaxLeftBorderSum=0; int MaxRightBorderSum=0; int LeftBorderSum=0,RightBorderSum=0; int Center,i; if(Left==Right) if(A[Left]0) return A[Left]; else return 0; Center=(left+ right)/2; MaxLeftSum=MaxSubSum(A,left,Center); MaxRightSum=MaxSubSum(A, Center+1, right); for(i= Center;i=left;i--) //从中间往左边加 { LeftBorderSum+=A[i]; if(LeftBorderSumMaxLeftBorderSum) MaxLeftBorderSum=LeftBorderSum; } for(i= Center+1;i= right;i++)//从中间往后面加 { RightBorderSum+=A[i]; if(RightBorderSumMaxRightBorderSum) MaxRightBorderSum=RightBorderSum; } return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum+MaxR
文档评论(0)