1、算法设计与分析报告算法设计与分析报告小组成员: 陈壮茂,陈振凯,张建龙,莫媚,林晓丹报告内容:1.给定数组a0:n-1,试设计一个算法,在最坏情况下用n+logn-2次比较找出a0:n-1 中的元素的最大值和次大值. 分析:a0:n-1 是说这个数组有n个元素,序号为0到n-1 n+logn-2就是一个算法复杂度,应该是n+logn的整数部分-2。首先对数组相邻的两个进行比较,将大的放在后面,小的放在前面,然后在两个数中小的所有数选出最小,同时也在两个数中大的所有数选出最大的。可以得出总的比较次数: (int)(n/2)+2*(int)(n/2)-1). 代码如下:#include#defin
2、e N 9int k=0;int max(int num,int n) int bigN,i; coutmaxendl; for(i=0;2*inumn-i-1) bigi=numi; else bigi=numn-i-1; if(n%2!=0) bigi=numi; i+; if(i=1) return big0; else return max(big,i);int fun(int &second,int num,int n) int bigN,smallN,i,number; coutfunendl; for(i=0;2*inumn-i-1) bigi=numi; smalli=numn
3、-i-1; else bigi=numn-i-1; smalli=numi; if(n%2) bigi=numi; i+; number=max(small,i); second=secondnumber? second:number; k+; if(i=1) return big0; else return fun(second,big,i);void main() int numN,second,i,large; cout请输入N个数endl; for(i=0;inumi; second=num0num1? num1:num0; k+; large=fun(second,num,N); c
4、out最大值是:largeendl次大值是:secondendl其中比较次数为:kendl;最初数据a1 a2 a3 a4 a5 4 3 6 9 8 运行过程中的数据变化与结果Second:3big: 8; 9; 6small: 4; 3 second: 4big: 8; 9samll: 6second:6big: 9small: 8second:8big: 92.求数列的最大子段和(要求时间复杂为nlogn)分析:给出n个整数(亦正亦负)组成的序列a1,a2,a3,an,求该序列中ai+ai+1+aj的子段和的最大值。当最大子段和为负数时,规定此数列的最大子段和为0. 算法和思路: 依据上面
5、的描述,所求的点i最大路径和ci应该为:Maxai, ci - 1 + ai int maxSubSum(int P) int i; int maxsum = 0; int c = 0; for(i = 0; i 0) c += Pi; else c = Pi; if(c maxsum) maxsum = c; return maxsum; 主函数: int main() int AMAX; int i,sum; printf(Please input a array: ); for(i = 0; i MAX; i+) scanf(%d,&Ai); sum = maxSubSum(A); pr
6、intf( The Max subsum is: %d,sum); return 0; 当输入数据为:8, 4, -1, 14运行过程:c=8+4=12(C=8+4-1)12(和又上升了,赋值给了C值)3.设计一个O(n*n)时间的算法,找出由n个数组成的序列最长单调递增子序列. 分析:(1)递推关系 对a(n)来说,由于它是最后一个数,所以当a(n)从开始查找时,只存在长度为1的不下降序列。 若从a(n-1)开始查找,则存在下面两种可能性: 若a(n-1)a(n) ,则存在长度为的不下降序列。 若从a(i)开始,此时最长不下降序列应该按下列方法求出:在a(i+1),a(i+2),a(n)中,
7、找出一个起始数据比a(i)大且最长的不下降序列,作为它的后续。(2)数据结构设计 用数组bi记录点i到得最长的不下降子序列的长度,记录点i在最长的不下降子序列的后继续数据编号。 算法如下: Int maxn=100;Int amaxn,bmaxn,cmaxn;Main()int n,I,j,max,p; input(n); for(i=1;i=1;i=i-1)max=0;p=0; for(j=i+1;j=n;j=j+1) if(aimax) max=bj;p=j; if(p0) bi=bp+1; ci=p;Max=0;p=0;For(i=1;imax) max=bi; p=I;Print(“m
8、axlong=“,max);Print(“result is:”);While(p0) print(ap); p=cp; 经过循环,数据的变化a1 =3; a2=18; a3=7b1 =1; b2= 1; b3=1c1 =0; c2= 0; c3=0变化结果:a1 =3; a2=18; a3=7b1 =2; b2= 1; b3=1c1 =2; c2= 0; c3= 04.礼物分配问题. 两兄弟Alan 和Bob, 共同分配n个礼物. 每个礼物只能分给其中的一个人,且不能分成两个.每个礼物i 的价值为vi, 为正整数.设 a 和 b 分别表示Alan 和 Bob所收到的礼物的总价值, V=, 为
9、所有礼物的总价值. 为使两兄弟高兴,我们希望尽可能地均分这些礼物, 即 |a-b| 打到最小。分析:该题目要求使得所分的礼物差值最小;首先,我们知道礼物总价值为V=;由于要使差值最小,则a与b要最接近于1/2V;故可以设a=1/2V+t,b=1/2V-t;故|a-b|=|(1/2V+t)-(1/2V-t)|=2t;而t=a-1/2V;其中V为已知,则只要a为大于1/2V的最小数即可。依照次数学思路,我们可以将该方法进行具体话:既是将数组降序排列(这一点很重要,可以用数学分析法进行证明),然后将数组的一个元素赋给a,如果a加上该元素后大于b,则将下一个元素赋给b,循环进行判断直至数组结束。数学证
10、明过程略代码如下:#includeusing namespace std;#define MaxSize 50void collat(int n,int v) int a=0; int b=0; int AlanMaxSize=0,BobMaxSize=0,r=0,s=0; for(int i=n;i0;i-) if(ab) b=b+v*i; Bobr=v*i; r+; else a=a+v*i; Alans=v*i; s+; coutAlan分配到的礼物为:endl; for(int j=0;jr;j+) coutAlanj ; coutendl; coutBob分配到的礼物为:endl;
11、for(int k=0;kr;k+) coutBobk ; coutendl; coutAlan分配到的礼物总价值为:aendl; coutBob分配到的礼物总价值为:bendl;int main() int num,v; coutnum; coutv; collat(num,v); return 0;7.键盘输入一个高精度的正整数N, 去掉其中任意S个数字后剩下的数字按左右次序将组成一个新的正整数.编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小. 代码如下:#include using namespace std; #define MaxSize 50 #define T 10
12、 void OrderArray(int N,int S) int arrayMaxSize=0; int i=0,j,a=N,max,tag; while(N=10) arrayi=N%10; N=N/10; i+; arrayi=N; for(j=0;j=0;p-) if(arrayparrayp-1) for(int s=p;s=0;r-) coutarrayr; int main() OrderArray(12435863,2); return 0; 8.最佳调度问题。假设有 个任务由 个并行的机器完成。完成任务i个需要的时间为 。 试设计一个算法找出完成这 个任务的最佳调度,使得完成
13、全部任务的时间最早。分析:可使用贪心算法解决该题目,对于n个任务,k个并行的机器,如果n=k,则先将n个任务进行降序排序,然后完成前k个任务,接着如果完成任务的机器还有时间完成后面的任务,则将任务该由机器完成,直至所有任务完成;代码如下:#includeusing namespace std;void BestAlloct(int array,int n,int k) int i,j,change=1,sum=0; int temp; for(i=n-1;i0&change;i-) change=0; for(j=0;ji;j+) if(arrayjarrayj+1) change=1; te
14、mp=arrayj; arrayj=arrayj+1; arrayj+1=temp; if(n=k) cout最少时间为:arrayn-1; else for(int r=0;rn;r=r+k) sum=sum+arrayr; for (int p=1;pk;p+) int sum2=arrayr+p; for(int s=r+k;sn;s+) if(sum2+arrays=arrayr) sum2=sum2+arrays; arrays=0; Cout” 最少时间为:”sumendl;int main() int a6=15,14,12,10,6; BestAlloct(a,6,3); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1