算法设计与分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析报告
◎小组成员:
陈壮茂,陈振凯,张建龙,莫媚,林晓丹
◎报告内容:
1.给定数组a[0:n-1],试设计一个算法,在最坏情况下用n+[logn]-2次比较找出a[0:n-1] 中的元素的最大值和次大值.
◎分析:a[0:n-1] 是说这个数组有n个元素,序号为0到n-1 n+[logn]-2就是一个算法复杂度,应该是n+logn的整数部分-2。
◎首先对数组相邻的两个进行比较,将大的放在后面,小的放在前面,然后在两个数中小的所有数选出最小,同时也在两个数中大的所有数选出最大的。可以得出总的比较次数:(int)(n/2)+2*((int)(n/2)-1).
◎代码如下:
#include
#define N 9
int k=0;
int max(int num[],int n)
{
int big[N],i;
cout<<"max"< for(i=0;2*i<=n-2;i++) { if(k++,num[i]>num[n-i-1]) big[i]=num[i]; else big[i]=num[n-i-1]; } if(n%2!=0) { big[i]=num[i]; i++; } if(i==1) return big[0]; else return max(big,i); } int fun(int &second,int num[],int n) { int big[N],small[N],i,number; 第1页 cout<<"fun"< for(i=0;2*i<=n-2;i++) { if(k++,num[i]>num[n-i-1]) { big[i]=num[i]; small[i]=num[n-i-1]; } else { big[i]=num[n-i-1]; small[i]=num[i]; } } if(n%2) { big[i]=num[i]; i++; } number=max(small,i); second=second>number? second:number; k++; if(i==1) return big[0]; else return fun(second,big,i); } void main() { int num[N],second,i,large; cout<<"请输入"< for(i=0;i cin>>num[i]; second=num[0]>num[1]? num[1]:num[0]; k++; large=fun(second,num,N); cout<<"最大值是:"< } ◎最初数据 第2页 ◎运行过程中的数据变化与结果 2.求数列的最大子段和(要求时间复杂为nlogn) ◎分析:给出n个整数(亦正亦负)组成的序列a[1],a[2],a[3],…,a[n],求该序列中 a[i]+a[i+1]+…+a[j]的子段和的最大值。当最大子段和为负数时,规定此数列的最大子段和为0. ◎算法和思路: 依据上面的描述,所求的点i最大路径和c[i]应该为:Max{a[i], c[i - 1] + a[i]} int maxSubSum(int P[]) { int i; int maxsum = 0; int c = 0; for(i = 0; i < MAX; i++) { if(c > 0) c += P[i]; else c = P[i]; if(c > maxsum) maxsum = c; } return maxsum; } ◎主函数: int main() { int A[MAX]; int i,sum; printf("Please input a array: "); for(i = 0; i < MAX; i++) scanf("%d",&A[i]); sum = maxSubSum(A); printf(" The Max subsum is: %d",sum); 第3页 return 0; } ◎当输入数据为:8, 4, -1, 14 ◎运行过程: c=8+4=12 (C=8+4-1)<12(和会下降,于是不能赋值给maxsum) (C=8+4-1+14)>12(和又上升了,赋值给了C值) 3.设计一个O(n*n)时间的算法,找出由n个数组成的序列最长单调递增子序列. ◎分析:(1)递推关系 ①对a(n)来说,由于它是最后一个数,所以当a(n)从开始查找时,只存在长度为1的不下降序列。 ②若从a(n-1)开始查找,则存在下面两种可能性: 若a(n-1) 若a(n-1)>a(n) ,则存在长度为的不下降序列。 ③若从a(i)开始,此时最长不下降序列应该按下列方法求出:在 a(i+1),a(i+2),…,a(n)中,找出一个起始数据比a(i)大且最长的不下降序列,作为它的后续。 (2)数据结构设计 用数组b[i]记录点i到得最长的不下降子序列的长度,记录点i在最长的不下降子序列的后继续数据编号。 ◎算法如下: Int maxn=100; Int a[maxn],b[maxn],c[maxn]; Main() {int n,I,j,max,p; input(n); for(i=1;i<=n;i=i+1) {input(a[i]); b[i]=1; c[i]=0;} For(i=n-1;i>=1;i=i-1) {max=0;p=0; for(j=i+1;j<=n;j=j+1) if(a[i]max) {max=b[j];p=j;} if(p<>0) {b[i]=b[p]+1; c[i]=p;} } Max=0;p=0; For(i=1;i<=n;i++) if(b[i]>max) 第4页