算法复习题-2015
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计复习提纲
第一章算法引论
1、算法的定义以及五个特征
算法是完成特定任务的有限指令集,所有的算法都必须满足以下5个特征:
即,输入、输出、确定性、有限性、能行性或可行性。
2、算法与程序的主要区别
算法必须满足定义中的5个特征,而程序不需要满足5个特征中的(C)
A.输入
B.确定性
C.有限性
D.能行性
3、算法的空间复杂度
算法的空间复杂度是指其运行所需的存储空间。程序运行所需的存储空间主要由两部分组成,即固定空间需求和可变空间需求。
4、算法的时间复杂度
算法的时间复杂度是指算法运行所需的时间,时间复杂度通常包括最好、最坏和平均时间复杂度。
5、在算法的时间复杂度分析中,其中比较容易分析和计算且最有实际价值的是(A)
A.最坏时间复杂度
B.最好时间复杂度
C.平均时间复杂度
D.最好时间复杂度和最坏时间复杂度
6、程序步
一个程序步是指在语法上或语义上有意义的程序段,该程序段的执行时间必须与问题实例的规模无关。
7、给定的一个m次多项式,f(n)=a m n m+ a m-1n m-1+......+a1n+a0是m次多项式,且a m>0,则有
f(n)=O(n m)。
例如:若f(n)=3.6n3+2.5n2+3.8,则有f(n)=O(n3)。
8、多项式时间算法
凡可用多项式函数来对其计算时间限界的算法称为多项式时间算法。常用的多项式时间算法的时间复杂度可能为O(1),O(log2n),O(nlog2n),O(n3),O(n2),O(n)则给定的这六种多项时间算法的时间复杂度的大小关系为
O(1) 9、指数时间算法 凡可用指数函数来对其计算时间限界的算法称为指数时间算法。常用的指数时间算法的时间复杂度可能为:O(n n),O(2n),O(n!)则给定的这三种指数时间算法的时间复杂度的大小关系为 O(2n) < O(n!) < O(n n) 10、下面算法的时间复杂度是(O(n)) int Sum2(int n){ int total, i; total=0; i=1; while(i<=n) { total=total+i; i=i+2; } return total; } 11、下面算法的时间复杂度是(O(log2n)) int Sum4(int n){ int i=1, total=0; while(i<=n) { total=total+i; i=i*2; } return total; } 12、下面算法的时间复杂度是() i=s=0; while(s i++; s+=i; } 13、下面算法的时间复杂度是(O(n2)) sum=0; for(int i=0;i for(int j=0;j<=i;j++) sum=sum+a[i][j]; 第二章枚举算法 1、完美数的判定算法 (1)任何一个自然数都能被1和它本身所整除,而所有小于它本身的因子称为这个自然数的真因子,如果一个自然数的所有真因子之和等于这个自然数本身,则称这个自然数为完美数。下面给出的(B )是完美数。 A 5 B 6 C 7 D 8 (2)完美数的判定算法如下 int perfect(int n) //判断自然数n是否为完美数 { int i,sum=0; for(i=1;i<=n/2;i++) //穷举出n的所有可能的真因子 if(n%i==0) //条件成立,则说明i是n的一个真因子 sum=sum+i; //将真因子累加到变量sum中 if(sum==n) //条件成立,则满足了完美数的定义 return 1; else return 0; } 2、逆序数问题 设a[1:n]是一个具有n个不同元素的数组,数组的下标从1开始存储,用a[1]~a[n]这n 个单元存储这n个元素。如果对于数组中的任意两个下标i和j(1≤i≤n,1≤j≤n),当i (1)数组a[1:6]={4,7,3,6,8,2}共有(A )个逆序数 A 8 B 9 C 10 D 7 (2)求逆序数的枚举程序如下 int main() { int i,j,n,number=0; int a[100]; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n-1;i++) //i是数偶中第一个数的可能下标 for(j=i+1;j<=n;j++) //j是数偶中第二个数的可能下标 if(a[i]>a[j]) number++; //累计逆序数偶个数 printf("数组中的逆序个数为%d\n",number); system("pause"); return 0; } 3、最简真分数 对于一个分数而言,如果它的分子小于分母,则我们称这样的分数为真分数,如果一个真分数的分子与分母无大于1的公因子,即不存在大于等于2的公因子,则称这样的真分数为最简真分数。例如2/3,3/7,5/9等都是最简真分数,而3/9,7/5就不是最简真分数。 (1)下面所给出的分数中是最简真分数的为( B ) A 2/4 B 3/4 C 7/3 D 4/8 (2)分母在2到5之间的最简真分数共有( B )个。 A 8 B 9 C 10 D 7 注意:这9个最简真分数分别是1/2,1/3,2/3,1/4,3/4,1/5,2/5,3/5,4/5 (3)最简真分数问题的枚举算法如下 int main() //该程序求分母在[a,b]区间内的最简真分数的个数,并求这些//最简真分数以递增次序排列时的第k项 { int i,j,u,t,a,b,k,n=0; int c[3000],d[3000]; scanf("%d%d%d",&a,&b,&k); for(j=a;j<=b;j++) //j表示分母的取值范围 for(i=1;i<=j-1;i++) //i表示最简真分数的分子的可能取值范围 { for(u=2;u<=i;u++) //u表示分子i和分母j的可能存在的大于1的公因子 if(i%u==0&&j%u==0) break; if(u>i) { n++; //累计最简真分数的个数 c[n]=i; //数组c存储每个最简真分数的分子 d[n]=j; //数组d存储每个最简真分数的分母 } } for(j=1;j