第02讲 什么是算法? 课堂互动
隐藏答案 | 返回首页
作者:欧新宇(Xinyu OU)
最后更新:2023-08-08
【课前自测02】
1.(单选)在下列函数中,哪个函数具有最快的增长速度。
A. n log 2 n n \log^2n n log 2 n
B. n 2 log n n^2 \log n n 2 log n
C. n 3 n^3 n 3
D. n log n 2 n \log n^2 n log n 2
答案及解析:C
2.(单选)算法的优劣与算法描述语言无关,但与所用计算机有关。
A. 正确
B. 错误
答案及解析:B
算法的优劣既与算法描述的语言无关,也与计算机无关。
3.(单选)计算机算法指的是()。
A. 计算方法
B. 排序方法
C. 解决问题的步骤序列
D. 调度方法
答案及解析:C
4.(单选)某算法的语句执行频度为 ( 3 n + n log 2 n + n 2 + 8 ) (3n+n\log_2n+n^2+8) ( 3 n + n log 2 n + n 2 + 8 ) ,其时间复杂度为()。
A. O ( n ) O(n) O ( n )
B. O ( n log 2 n ) O(n\log_2n) O ( n log 2 n )
C. n 2 n^2 n 2
D. O ( log 2 n ) O(\log_2n) O ( log 2 n )
答案及解析:C
在计算多个时间复杂度的和的复杂度时,以复杂度最高的一个作为数量级的衡量标准。此处,时间复杂度最大的一项是 n 2 n^2 n 2 。
5.(多选)算法的时间复杂度取决于( )。
A. 问题的规模
B. 待处理数据的初态
C. 计算机的配置
D. 编程语言的种类
答案及解析:AB
算法的时间复杂度不仅与问题的规模有关,还与问题的其他因素有关。如某些排序的算法,其执行时间与待排序记录的初始状态有关。为此,有时会对算法有最好、最坏以及平均时间复杂度的评价。
6.(单选)某算法的时间复杂度为 O ( n 2 ) O(n^2) O ( n 2 ) ,表明该算法的()。
A. 问题规模是 n 2 n^2 n 2
B. 执行时间等于 O ( n 2 ) O(n^2) O ( n 2 )
C. 执行时间与 O ( n 2 ) O(n^2) O ( n 2 ) 成正比
D. 问题规模与 O ( n 2 ) O(n^2) O ( n 2 ) 成正比
答案及解析:C
时间复杂度为 O ( n 2 ) O(n^2) O ( n 2 ) ,说明算法的时间复杂度 T ( n ) T(n) T ( n ) 满足 T ( n ) ≤ c n 2 T(n) \leq cn^2 T ( n ) ≤ c n 2 (c为比例常数),即 T ( n ) = O ( n 2 ) T(n)=O(n^2) T ( n ) = O ( n 2 ) ,时间复杂度 T ( n ) T(n) T ( n ) 是问题规模 n n n 的函数,其问题规模仍然是 n n n ,而不是 n 2 n^2 n 2 。
【课堂互动2.1】 算法的基本概念@1.1
1.(单选)算法的时间复杂度不受以下哪些因素的影响。
A. 问题规模
B. 待处理数据状态
C. 处理器的速度
D. 关键步骤的重复次数
答案及解析:C
2.(单选)数据结构中的算法是指()。
A. 计算机程序
B. 解决问题的方法
C. 查找或排序过程
D. 求解特定问题的指令有限序列
答案及解析:D
3.(单选)对一个算法的评价,不包括如下()方面的内容。
A. 健壮性和可读性
B. 并行性
C. 正确性
D. 时空复杂性
答案及解析:B
一个算法的优劣应该从以下几个方面评价:正确性、可读性、健壮性和高效性。选项D中的“时空复杂性”属于高效性评价的指标。所以,只有选项B是错误的。
4.(单选)通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是()。
A. 正确性算法应能正确地实现预定的功能
B. 易读性算法应易于阅读和理解,以便调试、修改和扩充
C. 正确性健壮性指环境发生变化时,算法能是当地作出反应或进行处理,不会产生不需要的运行结果
D. 高效性即达到所需要的时间性能
答案及解析:D
高效性包括时间和空间两个方面,而不应该仅指时间性能高效。
5.(单选)一个算法应该是()。
A. 程序
B. 问题求解步骤的描述
C. 要满足五个基本特性
D. 能够完整运行并产生输出
答案及解析:B
本题是中山大学考研真题,考查算法的定义。程序不一定满足有穷性,如死循环、操作系统等,而算法必须有穷。算法代表对问题求解步骤的描述,而程序则是算法在计算机上的特定实现。选项C是算法的必要条件,但不是算法的定义。
【课堂互动2.2】 算法的时间复杂度@1.2
1.(判断)在数据结构的范畴中,任何能够描述客观事物属性的符号集合都称为数据。
A. 正确
B. 错误
答案及解析:B
数据是能够 输入到计算机 ,并且用于描述客观事物属性的符号的集合。
2.(填空)试分析以下程序段的时间复杂度。
x = 90 ; y = 100 ;
while ( y > 0 )
if ( x > 100 ) {
x = x- 10 ;
y-- ;
}
else x++ ;
答案及解析:O(1)
基本语句:x = x-10; y--;
T ( N ) = = O ( 1 ) T(N) = = O(1) T ( N ) == O ( 1 )
需要注意的是,在本题的算法中,两个变量x和y的值都确定的,因此后面的程序段是有固定的执行次数的,并不会因为问题规模的变化而变化。虽然基本语句会被执行很多次,但是我们可以将其理解为程序由很多步组成,而每一步的执行次数是固定的,因此时间复杂度为O(1)。非常数阶的时间复杂度,一定是一个和问题规模n成正比的函数f(n)。
3.(填空)试分析以下程序段的时间复杂度。
for ( i= 0 ; i< n; i++ )
for ( j= 0 ; j< m; j++ )
a[ i] [ j] = 0 ;
答案及解析:O(m*n)
基本语句:a [ i ] [ j ] = 0 ; a[i][j] = 0; a [ i ] [ j ] = 0 ;
执行次数 = ∑ i = 0 n ∑ j = 0 m 1 = ∑ i = 0 n m = m ∗ n = \sum_{i=0}^n \sum_{j=0}^m \mathbb{1} = \sum_{i=0}^n m = m*n = ∑ i = 0 n ∑ j = 0 m 1 = ∑ i = 0 n m = m ∗ n
T ( N ) = O ( m ∗ n ) T(N) = O(m*n) T ( N ) = O ( m ∗ n )
【课堂互动2.3】 算法的空间复杂度、数据结构求解问题的过程@1.3-1.4
1.(单选)在数据结构求解问题的过程中,以下哪一个步骤的主要目的是获取最优算法。
A. 问题描述
B. 存储结构设计
C. 算法设计
D. 算法分析
答案及解析:D
2.(单选)空间复杂度通常按照()情况来进行分析。
A. 最优
B. 最坏
C. 平均
D. 任意
答案及解析:B
3.(单选)下面算法将一维数组 a a a 中的 n n n 个数逆序存放到原数组中,空间复杂度为()。
for ( i= 1 ; i<= n; i++ )
b[ i] = a[ n- i- 1 ] ;
for ( j= 1 ; j<= 2 * i; j++ )
a[ i] = b[ i] ;
A. O ( 1 ) O(1) O ( 1 )
B. O ( n ) O(n) O ( n )
C. O ( log 2 n ) O(\log_2n) O ( log 2 n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
算法的空间复杂度只需要分析该算法在实现时所需要的辅助空间与问题规模n n n 的函数关系。该算法那需要另外借助一个大小为 n n n 的辅助数组b b b ,所以其空间复杂度为O ( n ) O(n) O ( n ) 。
4.(单选)下面算法将一维数组 a a a 中的 n n n 个数逆序存放到原数组中,空间复杂度为()。
for ( i= 1 ; i<= n/ 2 ; i++ ) {
t = a[ i] ;
a[ i] = a[ n- i- 1 ] ;
a[ n- i- 1 ] = t;
}
A. O ( 1 ) O(1) O ( 1 )
B. O ( n ) O(n) O ( n )
C. O ( log 2 n ) O(\log_2n) O ( log 2 n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:A
该算法仅需要另外借助一个变量t t t ,与问题规模n n n 大小无关,所以其空间复杂度为为O ( 1 ) O(1) O ( 1 ) 。
5.(填空)试分析以下程序段的时间复杂度。
i= 1 ;
while ( i<= n)
i= i* 3 ;
答案及解析:O ( log 3 n ) O(\log_3n) O ( log 3 n )
基本语句:i = i*3,每执行一次i乘3
设执行次数为t,则有 3 t < = n 3^{t}<=n 3 t <= n 。所以, t < = l o g 3 n t<=log_3 n t <= l o g 3 n
T ( n ) = O ( l o g 3 n ) T(n) = O(log_3 n) T ( n ) = O ( l o g 3 n )
6.(单选)以下程序段中语句 "x++;" 的语句频度为()。
for ( i= 1 ; i<= n; i++ )
for ( j= 1 ; j<= i; j++ )
for ( k= 1 ; k<= j; k++ )
x++ ;
A. n ( n + 1 ) ( 2 n + 1 ) 2 \frac{n(n+1)(2n+1)}{2} 2 n ( n + 1 ) ( 2 n + 1 )
B. n ( n + 1 ) ( n + 1 ) 2 \frac{n(n+1)(n+1)}{2} 2 n ( n + 1 ) ( n + 1 )
C. n ( n + 1 ) ( 2 n + 1 ) 6 \frac{n(n+1)(2n+1)}{6} 6 n ( n + 1 ) ( 2 n + 1 )
D. n ( n + 1 ) ( n + 2 ) 6 \frac{n(n+1)(n+2)}{6} 6 n ( n + 1 ) ( n + 2 )
答案及解析:D
基本语句:x++;
语句频度:∑ i = 1 n ∑ j = 1 i ∑ k = 1 j 1 = ∑ i = 1 n ∑ j = 1 i j = 1 2 ∑ i = 1 n i ( i + 1 ) = 1 2 ( ∑ i = 1 n i 2 + ∑ i = 1 n i ) = 1 2 ( ( n ( n + 1 ) ( 2 n + 1 ) 6 + n ( n + 1 ) 2 ) = n ( n + 1 ) ( n + 2 ) 6 \sum_{i=1}^n \sum_{j=1}^{i} \sum_{k=1}^{j} \mathbb{1} = \sum_{i=1}^n \sum_{j=1}^{i} j = \frac{1}{2} \sum_{i=1}^n i(i+1) \\
= \frac{1}{2}(\sum_{i=1}^n i^2+ \sum_{i=1}^n i) \\
= \frac{1}{2}(\frac{(n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2}) \\
= \frac{n(n+1)(n+2)}{6} ∑ i = 1 n ∑ j = 1 i ∑ k = 1 j 1 = ∑ i = 1 n ∑ j = 1 i j = 2 1 ∑ i = 1 n i ( i + 1 ) = 2 1 ( ∑ i = 1 n i 2 + ∑ i = 1 n i ) = 2 1 ( 6 ( n ( n + 1 ) ( 2 n + 1 ) + 2 n ( n + 1 ) ) = 6 n ( n + 1 ) ( n + 2 )
【课后作业02】
1.(单选)[2011统考真题] 设 n n n 是描述问题规模的非负整数,下面的程序片段的时间复杂度是()。
x = 2 ;
while ( x < n/ 2 )
x = 2 * x
A. O ( log 2 n ) O(\log_2 n) O ( log 2 n )
B. O ( n ) O(n) O ( n )
C. O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:A
基本语句:x = 2*x,每执行一次x乘2
设执行次数为t,则有 2 t + 1 < = n 2^{t+1}<=n 2 t + 1 <= n 。所以, t < = log 2 n − 1 t<=\log_2 n - 1 t <= log 2 n − 1
T ( n ) = O ( log 2 n ) T(n) = O(\log_2 n) T ( n ) = O ( log 2 n )
2(单选)[2012统考真题] 求整数 n ( n ≥ 0 ) n (n \geq 0) n ( n ≥ 0 ) 的阶乘的算法如下,其时间复杂度是()。
int fact ( int n) {
if ( n<= 1 )
return 1 ;
return n* fact ( n- 1 ) ;
}
A. O ( log 2 n ) O(\log_2 n) O ( log 2 n )
B. O ( n ) O(n) O ( n )
C. O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
本题是阶乘n!的递归代码,即n × ( n − 1 ) × . . . × 1 n×(n-1)×...×1 n × ( n − 1 ) × ... × 1 。每次递归调用fact()一次,共执行了n次递归调用,因此 T ( n ) = O ( n ) T(n)=O(n) T ( n ) = O ( n ) 。
3.(单选)[2013统考真题] 已知两个长度分别为 m 和 n 的升序链表,若将它们合并为长度为 m+n 的一个降序链表,则最坏情况下的时间复杂度是()。
A. O ( n ) O(n) O ( n )
B. O ( m n ) O(mn) O ( mn )
C. O ( m i n ( m , n ) ) O(min(m, n)) O ( min ( m , n ))
D. O ( m a x ( m , n ) ) O(max(m, n)) O ( ma x ( m , n ))
答案及解析:D
对两个升序链表进行降序合并,可以将两个链表中的元素依次进行比较,然后最小的那个元素放入链表的尾部,然后继续进行比较,以此类推。当某一个链表比较完毕后,将另外一个链表剩余的元素依次放入新链表即可。
在这个过程中,我们只需要讨论比较元素的次数,而不需要考虑移动的次数,因为移动结点的次数都是m+n。
在最好情况下,两个链表的元素值,其大小是没有交叉的,也就是只需要比较完一个链表(长度较短的那个)就可以实现合并,其复杂度为O(min(m,n))。
在最坏的情况下,就是两个链表的每一个元素都被比较过了,最多就是m+n-1次。当m和n等长的时候,其时间复杂度就是 O ( m + n ) = 2 O ( m ) = 2 O ( n ) = O ( n ) O(m+n) = 2O(m) = 2O(n) = O(n) O ( m + n ) = 2 O ( m ) = 2 O ( n ) = O ( n ) ,亦等于 O ( max ( m , n ) ) O(\max(m, n)) O ( max ( m , n )) ;当m和n不等长的时候,且相差较大时,其时间复杂度由m和n中较大的一个决定,就是O ( max ( m , n ) ) O(\max(m, n)) O ( max ( m , n )) ;当m和n不等长,且相差不大时,其时间复杂度为O ( m + n ) O(m+n) O ( m + n ) ,此时,我们也可以将其近似看作等长,即O ( m + n ) = 2 O ( m ) = 2 O ( n ) O(m+n) = 2O(m) = 2O(n) O ( m + n ) = 2 O ( m ) = 2 O ( n ) ,也可以表示为O ( max ( m , n ) ) O(\max(m, n)) O ( max ( m , n )) 。
4.(单选)[2014统考真题] 下列程序段的时间复杂度为()。
count = 0 ;
for ( k= 1 ; k<= n; k*= 2 )
for ( j= 1 ; j<= n; j++ )
count++ ;
A. O ( log 2 n ) O(\log_2 n) O ( log 2 n )
B. O ( n ) O(n) O ( n )
C. O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:C
基本语句:count++
内层执行次数 = ∑ j = 1 n 1 = n = \sum_{j=1}^n \mathbb{1} = n = ∑ j = 1 n 1 = n
设外层执行次数为t,则有 2 t < = n 2^t <= n 2 t <= n ,则 t < = log 2 n t <= \log_2 n t <= log 2 n
整体时间复杂度:T(n) = 内层×外层 = O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
5.(单选)[2017统考真题] 下列函数的时间复杂度为()。
int func ( int n) {
int i = 0 , sum = 0 ;
while ( sum < n)
sum += ++ i;
return i;
}
A. O ( log n ) O(\log n) O ( log n )
B. O ( n 1 / 2 ) O(n^{1/2}) O ( n 1/2 )
C. O ( n ) O(n) O ( n )
D. O ( n log n ) O(n \log n) O ( n log n )
答案及解析:C
基本语句:sum += ++i,等价于++i, sum = sum + i
每循环依次,i自增一。i=1时,sum=0+1;i=2时,sum=0+1+2;以此类推。
设执行次数为 t,则有 sum=0+1+2+...+t=t(t+1)/2,于是有 sum = t(t+1)/2 < n,即 t < n t < \sqrt{n} t < n
时间复杂度:T(n) = O ( n ) O(\sqrt n) O ( n )
6.(单选)[2019统考真题] 设 n n n 是描述问题规模的非负数,下列程序段的时间复杂度是()。
x = 0 ;
while ( n >= ( x+ 1 ) * ( x+ 1 ) ) {
x = x + 1 ;
}
A. O ( log n ) O(\log n) O ( log n )
B. O ( n 1 / 2 ) O(n^{1/2}) O ( n 1/2 )
C. O ( n ) O(n) O ( n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
基本语句:x = x + 1
设执行次数为t,则有 n > ( t + 1 ) 2 n > (t+1)^2 n > ( t + 1 ) 2 。所以,t < n − 1 t < \sqrt{n} - 1 t < n − 1
T ( N ) = O ( n ) T(N) = O(\sqrt{n}) T ( N ) = O ( n )
7.(单选)[2022统考真题] 下列程序段的时间复杂度是()。
int sum = 0 ;
for ( int i= 1 ; i< n; i*= 2 )
for ( int j= 0 ; j< i; j++ )
sum++ ;
A. O ( log n ) O(\log n) O ( log n )
B. O ( n ) O(n) O ( n )
C. O ( n log n ) O(n \log n) O ( n log n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
外层循环的复杂度为O ( l o g 2 n ) O(log_2n) O ( l o g 2 n ) ,内层循环复杂度是n,但因注意内层不是0<j<n,因此总的复杂度不是O ( n l o g 2 n ) O(nlog_2 n) O ( n l o g 2 n )
当外层循环的变量 i 取不同值时,内存循环就执行多少次,因此总循环次数为i的所有取值之和。假设外层循环共执行了k次,当 i = 1 , 2 , 4 , 8 , . . . , 2 k − 1 ( 2 k − 1 < n ≤ 2 k ) i=1,2,4,8,...,2^{k-1} (2^{k-1} < n \leq 2^k) i = 1 , 2 , 4 , 8 , ... , 2 k − 1 ( 2 k − 1 < n ≤ 2 k ) 时,内层循环执行i次,因此总循环次数 T = 1 + 2 + 4 + 8 + . . . + 2 k − 1 = 1 ∗ ( 1 − 2 k ) ( 1 − 2 ) = 2 k − 1 T=1+2+4+8+...+2^{k-1} = \frac{1*(1-2^k)}{(1-2)} = 2^k -1 T = 1 + 2 + 4 + 8 + ... + 2 k − 1 = ( 1 − 2 ) 1 ∗ ( 1 − 2 k ) = 2 k − 1 次。
由于i和n的关系是,n每倍增1次,i才向内执行1次,因此i和n是可以认为是同步增长的。例如,当n=32时,i=1,2,4,8,16,内层的总执行次数等于 2 k 2^k 2 k -1 = 31。因此,T和n基本上是同步( 2 k < n < 2 k + 1 ) (2^k<n<2^{k+1}) ( 2 k < n < 2 k + 1 ) ,所以,时间复杂度为 O ( n ) O(n) O ( n ) 。
8.(多选)下面说法错误的是()。
A. 算法原地工作的含义是指不需要任何额外的辅助空间
B. 在相同的规模 n n n 下,复杂度 O ( n ) O(n) O ( n ) 的算法在时间上总是优于复杂度 O ( 2 n ) O(2^n) O ( 2 n ) 的算法
C. 所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界
D. 某算法的时间复杂度为 O ( n 2 ) O(n^2) O ( n 2 ) ,表明该算法的执行时间与 n 2 n^2 n 2 成正比
答案及解析:A
原地工作指算法执行时所需要的辅助空间,其相对于输入量而言是个常数,语句A声称不需要任何额外辅助空间是错误的。
【扩展练习02】
1.(填空)试分析以下程序段的时间复杂度。
s= 0 ;
for ( i= 0 ; i< n; i++ )
for ( j= 0 ; j< n; j++ )
s += B[ i] [ j] ;
sum = s;
答案及解析:O ( n 2 ) O(n^2) O ( n 2 )
基本语句:s s s += B [ i ] [ j ] ; B[i][j]; B [ i ] [ j ] ;
T ( N ) = ∑ i = 0 n ∑ j = 0 n 1 = ∑ i = 0 n n = n 2 = O ( n 2 ) T(N) = \sum_{i=0}^n \sum_{j=0}^n \mathbb{1} = \sum_{i=0}^n n = n^2 = O(n^2) T ( N ) = ∑ i = 0 n ∑ j = 0 n 1 = ∑ i = 0 n n = n 2 = O ( n 2 )
2.(填空)试分析以下程序段的时间复杂度。
x= 0 ;
for ( i= 1 ; i< n; i++ )
for ( j= 1 ; j<= n- i; j++ )
x++ ;
答案及解析:O ( n 2 ) O(n^2) O ( n 2 )
基本语句:x++
执行次数 = (n-1)+(n-2)+...+1 = (n-1+1)(n-1)/2 = n(n-1)/2
T ( N ) = O ( n 2 ) T(N) = O(n^2) T ( N ) = O ( n 2 )
3.(填空)试分析以下程序段的时间复杂度。
x = n;
y = 0 ;
while ( x >= ( y+ 1 ) * ( y+ 1 ) )
y++ ;
答案及解析:O ( n ) O(\sqrt{n}) O ( n )
基本语句:y++
设执行次数为t,则有 x ≥ t 2 x \geq t^2 x ≥ t 2 。所以,t ≤ n t \leq \sqrt{n} t ≤ n
T ( N ) = O ( n ) T(N) = O(\sqrt{n}) T ( N ) = O ( n )
4.(单选)以下程序段的时间复杂度为()。
void fun ( int n)
int i = 1 ;
while ( i <= n)
i = i * 2 ;
A. O ( n ) O(n) O ( n )
B. O ( n 2 ) O(n^2) O ( n 2 )
C. O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
D. O ( log 2 n ) O(\log_2 n) O ( log 2 n )
答案及解析:D
基本语句:i = i*2,每执行一次i乘2
设执行次数为t,则有 2 t < = n 2^{t}<=n 2 t <= n 。所以, t < = l o g 2 n t<=log_2 n t <= l o g 2 n
T ( n ) = O ( l o g 2 n ) T(n) = O(log_2 n) T ( n ) = O ( l o g 2 n )
5.(单选)以下程序段的时间复杂度为()。
void fun ( int n) {
int i = 0 ;
while ( i* i* i <= n)
i++ ;
}
A. O ( n ) O(n) O ( n )
B. O ( n log 2 n ) O(n \log_2 n) O ( n log 2 n )
C. O ( n 3 ) O(\sqrt[3]{n}) O ( 3 n )
D. O ( n ) O(\sqrt{n}) O ( n )
答案及解析:C
基本语句:i++
设执行次数为t,则有 t 3 < = n t^{3}<=n t 3 <= n 。所以, t < = n 3 t<=\sqrt[3]{n} t <= 3 n
T ( n ) = O ( n 3 ) T(n) = O(\sqrt[3]{n}) T ( n ) = O ( 3 n )
6.(单选)有一程序段如下:
for ( i= n- 1 ; i> 1 ; i-- )
for ( j= 1 ; j< i; j++ )
if ( A[ j] > A[ j+ 1 ] )
A[ j] 与 A[ j+ 1 ] 对换;
}
其中 n n n 为正整数,则最后一行语句的频度在最坏情况下是()。
A. O ( n ) O(n) O ( n )
B. O ( n log n ) O(n \log n) O ( n log n )
C. O ( n 3 ) O(n^3) O ( n 3 )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:D
基本语句:A[j] 与 A[j+1] 对换
设执行次数 = ∑ i = 2 n − 1 ∑ j = 1 i − 1 1 = ∑ i = 2 n − 1 ( i − 1 ) = ( 1 + n − 2 ) ( n − 2 ) / 2 = ( n − 1 ) ( n − 2 ) / 2 = \sum_{i=2}^{n-1} \sum_{j=1}^{i-1} \mathbb{1} = \sum_{i=2}^{n-1} (i-1) =(1+n-2)(n-2)/2=(n-1)(n-2)/2 = ∑ i = 2 n − 1 ∑ j = 1 i − 1 1 = ∑ i = 2 n − 1 ( i − 1 ) = ( 1 + n − 2 ) ( n − 2 ) /2 = ( n − 1 ) ( n − 2 ) /2
T ( n ) = O ( n 2 ) T(n) = O(n^2) T ( n ) = O ( n 2 )
7.(单选)以下算法中的基本语句的执行次数为()。
int m = 0 , i, j;
for ( i= 1 ; i<= n; i++ )
for ( j= 1 ; j<= 2 * i; j++ )
m++ ;
}
A. n ( n + 1 ) n(n+1) n ( n + 1 )
B. n n n
C. n + 1 n+1 n + 1
D. n 2 n^2 n 2
答案及解析:A
基本语句:m++
设执行次数 = ∑ i = 1 n ∑ j = 1 2 i 1 = ∑ i = 1 n 2 i = 2 ∑ i = 1 n i = n ( n + 1 ) = \sum_{i=1}^n \sum_{j=1}^{2i} \mathbb{1} = \sum_{i=1}^{n} 2i = 2 \sum_{i=1}^{n} i = n(n+1) = ∑ i = 1 n ∑ j = 1 2 i 1 = ∑ i = 1 n 2 i = 2 ∑ i = 1 n i = n ( n + 1 )
T ( n ) = O ( n 2 ) T(n) = O(n^2) T ( n ) = O ( n 2 )
8.(单选)如果一个算法的时间复杂度为 ( 3 n 2 + 2 n log 2 n + 4 n − 7 ) / 5 n (3n^2+2n\log_2n+4n-7)/5n ( 3 n 2 + 2 n log 2 n + 4 n − 7 ) /5 n ,那么时间复杂度的数量级表示为()。
A. O ( log n ) O(\log n) O ( log n )
B. O ( n ) O(n) O ( n )
C. O ( n log n ) O(n \log n) O ( n log n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
多个时间复杂度的和的时间复杂度数量级等于最复杂的那个项。本题中包含4个项,分别是O ( 3 n ) , O ( 2 l o g 2 n ) , 4 , 7 / n O(3n), O(2log_2n), 4, 7/n O ( 3 n ) , O ( 2 l o g 2 n ) , 4 , 7/ n ,其中最大的是 O ( 3 n ) = O ( n ) O(3n)=O(n) O ( 3 n ) = O ( n ) 。
9.(单选)下面这段代码的复杂度是()。
x = 0 ;
while ( n >= ( x+ 1 ) * ( x+ 1 ) )
x = x + 1 ;
}
A. O ( l o g 2 n ) O(log_2 n) O ( l o g 2 n )
B. O ( n 1 / 2 ) O(n^{1/2}) O ( n 1/2 )
C. O ( n ) O(n) O ( n )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:B
基本语句:x = x + 1
设k为循环次数,当执行第k次循环时,x的值为k-1。循环执行条件 n ≤ ( x + 1 ) 2 n \leq(x+1)^2 n ≤ ( x + 1 ) 2 ,即k ≤ n 1 / 2 k \leq n^{1/2} k ≤ n 1/2 ,因此时间复杂度为 O ( n 1 / 2 ) O(n^{1/2}) O ( n 1/2 ) 。
10.(单选)以下程序段中语句 "m++;" 的语句频度为()。
int m = 0 , i, j;
for ( i= 1 ; i<= n; i++ )
for ( j= 1 ; j<= 2 * i; j++ )
m++ ;
A. n ( n + 1 ) n(n+1) n ( n + 1 )
B. n n n
C. n + 1 n+1 n + 1
D. n 2 n^2 n 2 A
答案及解析:A
基本语句:m++;
语句频度:∑ i = 1 n ∑ j = 1 2 i 1 = ∑ i = 1 n 2 i = 2 ∑ i = 1 n i = n ( n + 1 ) \sum_{i=1}^n \sum_{j=1}^{2i} \mathbb{1} = \sum_{i=1}^n 2i =2 \sum_{i=1}^n i = n(n+1) ∑ i = 1 n ∑ j = 1 2 i 1 = ∑ i = 1 n 2 i = 2 ∑ i = 1 n i = n ( n + 1 )
11.(单选)设一维数组中有 n n n 个数组元素,则读取第 i i i 个数组元素的平均时间复杂度为()。
A. O ( n ) O(n) O ( n )
B. O ( n log 2 n ) O(n\log_2n) O ( n log 2 n )
C. O ( 1 ) O(1) O ( 1 )
D. O ( n 2 ) O(n^2) O ( n 2 )
答案及解析:C
读取第 i i i 个数组元素可以直接通过数组的下标定位,与 n n n 无关,因此平均时间复杂度为 O ( 1 ) O(1) O ( 1 ) 。
12.(单选)下列叙述中正确的是()。
A. 一个算法的空间复杂度大,则其时间复杂度也必定大
B. 一个算法的空间复杂度大,则其时间复杂度必定小
C. 一个算法的时间复杂度大,则其空间复杂度必定小
D. 以上三种说法都不对
答案及解析:D
算法的时间复杂度和空间复杂度没有直接关系。
13.(单选)下面关于算法说法正确的是()。
A. 算法最终必须由计算机程序实现
B. “为解决某个问题规定的算法”同“为该问题编写的程序”含义是相同的
C. 算法的可行性是指指令不能有二义性
D. 以上几个都是错误的
答案及解析:D
A选项,算法是为了解决某类问题而规定的一个有限长的操作序列,但并非必须由计算机实现的;
B选项,“为解决某个问题规定的算法”同“为该问题编写的程序”含义不同,因为程序的编写与具体的语言有关,而算法与语言无关。
C选项,算法的可行性是指算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
14.(单选)算法分析的两个主要方面是()。
A. 空间复杂度和时间复杂度
B. 正确性和简单性
C. 可读性和文档性
D. 数据复杂性和程序复杂性
答案及解析:A
时间高效时算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效时指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度时衡量算法的两个主要指标。
15.(单选)设有以下三个函数分别用来表示三个算法的语句频度之和:
f ( n ) = 1000 n 3 + n 2 + 1000 f(n) = 1000n^3 + n^2 +1000 f ( n ) = 1000 n 3 + n 2 + 1000
g ( n ) = 10 n 3 + 1000 n 2 g(n) = 10n^3 + 1000n^2 g ( n ) = 10 n 3 + 1000 n 2
h ( n ) = 1000 n 2.01 + 1000 n log 2 n h(n) = 1000n^{2.01} + 1000n\log_2n h ( n ) = 1000 n 2.01 + 1000 n log 2 n
以下关系式中,有错误的是()。
A. O ( f ( n ) ) = O ( g ( n ) ) O(f(n)) = O(g(n)) O ( f ( n )) = O ( g ( n ))
B. O ( g ( n ) ) = O ( n 3 ) O(g(n)) = O(n^3) O ( g ( n )) = O ( n 3 )
C. O ( h ( n ) ) = O ( n 2 ) O(h(n)) = O(n^2) O ( h ( n )) = O ( n 2 )
D. O ( h ( n ) ) = O ( n log 2 n ) O(h(n)) = O(n\log_2n) O ( h ( n )) = O ( n log 2 n )
答案及解析:D
在计算算法时间复杂度时,可以忽略所有低次幂项和最高次幂的系数,这体现出了增长率的含义。依据该原则,可以看出上述前两个算法的时间复杂度均为O ( n 3 ) O(n^3) O ( n 3 ) ,最后一个算法的时间复杂度为O ( n 2 ) O(n^2) O ( n 2 ) 。