第1章 算法
一、选择题
1. 算法的时间复杂度是指( )。 A)执行算法程序所需要的时间 B)算法程序中的指令条数
C)算法执行过程中所需要的基本运算次数 D)算法程序的长度
2. 算法的空间复杂度是指( )。 A)算法程序的长度
B)算法程序所占的存储空间
C)算法执行过程中所需要的存储空间 D)算法程序中的指令条数
3.下面( )的时间复杂度最好(即执行时间最短)。
A)O(n ) B)O(log2n) C)O(nlog2n ) D)O(n)
2
4.下面累加求和程序段的时间复杂度为( )。 int sum(int a[],int n) {
int i, s=0;
for (i=0;i 5.下面是将两个n阶矩阵a[][]与b[][]相加的结果存放到n阶矩阵c[][]中的算法,该算法的时间复杂度为( )。 void matrixadd(int a[][],int b[][],c[][],int n) { int i,j; for (i=0;i for(j=0;j c[i][j]=a[i][j]+b[i][j]; } A)O(1 ) B)O(log2n) C)O( n ) D)O(n) 6.下面程序段的时间复杂度为( )。 1 2 2 int i=0,s1=0,s2=0; while(i if(i%2) s1+=i; else s2+=i; i++; } A)O(1 ) B)O(log2n ) C)O(n ) D)O(n) 7.下面程序段的时间复杂度为( )。 int prime(int n) { int i=1; int x=(int)sqrt(n); while(i<=x) { i++; if(n%i==0) break; } if(i>x) return 1; else return 0; } A)O(1 ) B)O(log2n) C)O(n ) D)O(n) 8.下面程序段的时间复杂度为( ) int fun(int n) { int i=1,s=1; while(s i++; s+=i; } return i; } A)O(n/2) B)O(log2n) 2 2 C)O(n ) D)O(n) 9.下面程序段的时间复杂度为( ) int i,j,m,n,a[][]; for(i=0;i A)O(m) B)O(n) C)O(m*n ) D)O(m+n) 10. 下面程序段的时间复杂度为( ) int sum1(int n) { int i,p=1,s=0; for(i=1;i<=n;i++) { p*=i; s=s+p; } return s; } A)O(1 ) B)O(log2n) C)O(n ) D)O(n) 二、填空题 1.算法复杂度主要包括时间复杂度和 复杂度。 2.一个算法的时间复杂度的计算式为 ( 3n+2n+5 ) / n ,其数量级表示为 。 3.从一维数组a[n]中顺序查找出一个最大值元素的平均时间复杂度为 ,读取一个二维数组b[m][n]中任一元素的时间复杂度为 。 4.在下面程序段中,s = s+p语句的执行次数为 ,p*=j 语句的执行次数为 ,该程序段的时间复杂度为 。 int i=0, s=o; while(++i <=n) { int p=1; for(int j=1; j<=i ; j++ ) p*=j ; s=s+p ; } 5. 通常用平均性态分析和 两种方式来确定一个算法的工作量。 三、 简答题 3. 什么是算法? 4. 算法的基本特征是什么? 2 2 2 2 3 5. 算法的两种基本要素是什么? 6. 递归是算法的基本方法之一,其基本思想是什么? 7. 算法的描述方法有多种,试说出任意三种方法。 四、编写出求下列问题的算法 1.比较两个整型数据a1与a2的大小,对于a1 > a2、a1 == a2、a1< a2这三种不同情况应分别返回“>”、“=”、“<”字符。 2.求一维double型数组a[n]中的所有元素之乘积。 3.假定一维整型数组a[n]中的每个元素值x均在[0,200]区间内,分别统计出落在0≤x < 20、20≤x<50、50≤x<80、80≤x<130、13 ≤x≤200各区间内的元素个数。 参考答案 一、单选题 1.C 2.C 3.B 4.C 5.D 6.C 7.D 8.D 9.C 10.C 二、填空题 1. 空间 2. O(n) 3.O(n),O(1) 4. n,n(n+1)/2,O(n) 5. 最坏情况复杂性 三、简答题 1. 答案:所谓算法是指解题方案的准确而完整的描述。 2. 答案:算法的基本特征为:1)可行性;2)确定性;3)有穷性;4)拥有足够的情报。 3. 答案:算法通常由两种基本要素组成;一是对数据对象的运算和操作;二是算法的控制结构。 4. 答案:人们在解决一些复杂问题时,为了降低问题的复杂程度,一般总是将问题逐层分解,最后归结为一些最简单的问题。这种将问题逐层分解的过程,实际上并没有对问题进行求解。而只是当解决了最后那些最简单的问题后,再沿着原来分解的逆过程逐步进行综合,这就是递归的基本思想。 5.答案:一个算法可以用多种方式来描述,如自然语言、程序语言、流程图等。 四、算法设计 1.比较两个整型数据a1与a2的大小。 char compare(int a1,int a2) { if(a1>a2) return \elase if(a1==a2) return \ 4 2 elase return \} 2.求一维double型数组a[n]中的所有元素之乘积。 double product(dluble a[],int n) { double p=1; for(int i=0;i< n;i++) p=p*a[i]; return p; } 3.统计数组a[n]中的每个元素值x分别落在0≤x<20、20≤x<50、50≤x< 80、80≤x<130、130≤x≤200各区间内的元素个数。 int count(int a[],int n,int c[5]) //用c[5]保存统计结果 { int d[5]={20,50,80,130,201}; //用d[5]保存各统计区间上限 int i,j; for(i=0;i if(a[i]<0; || a[i]>200) return 0; //数组中数据有错,统计失败 for(j=0;j< 5;j++) if(a[i] c[j]++; //使统计相应区间的元素数增1 } return 1; //表示统计成功 } 5