算法设计与分析报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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页

相关文档
最新文档