解2022年408考研真题第1题
2022年408考研真题第1题,考察了时间复杂度的计算方法。题目内容如下:
下列程序段的时间复杂度是( )。
sum = 0;
for (i = 1; i < n; i *= 2)
for (j = 0; j < i; j++)
sum++;
A. O(logn) B. O(n) C. O(nlogn) D. O(n2)
对于这个题目,一种比较简单的解法是设 n 为 2 的倍数,即找一个特例,如令 n=2m ,则 m=log2n 。从而确定基本语句 sum++
的频度。
这种求解方法,能够得到正确答案,但仅仅停留在解决本题的应试技巧上,如果题目的条件更换了,外层循环不再是 i *= 2
,就不能以 2 的倍数特例了。更何况,我认为,在复习阶段,应该尽可能掌握最基本的方法,而不是将重点放在某些技巧上,因为技巧都是针对特殊现象的,只有基本方法才具有普遍适用性。掌握了基本方法,就不用担心试题的变化了;掌握了基本方法,试题再变化,也是“万变不离其宗”。
那么,针对这个题目,从基本方法角度出发,应该如何求解?
在网上,也能搜索到试图通过基本方法求解的文章(例如某乎网站),很可惜,该文章求解过程的计算有错误,且阐述语焉不详,思路跳跃。
下面,本文尝试给出一种方法,请大家欣赏,如果其中有误,敬请指正。
根据分析时间复杂度的方法,解题步骤如下:
第一步:基本语句是 sum++
。
第二步:基本语句处于嵌套循环中,内层循环与外层循环的变量相关,用下表列出外层循环和内层循环变量及基本语句循环次数(即内层循环次数)
外层循环(第 r 次) | 变量 i 的值 | 变量 j 的值 | 基本语句循环次数 |
---|
1 | 1=20 | 0 | 1=20 |
2 | 2×20=21 | 0,1 | 2=21 |
3 | 2×21=22 | 0,1,2,3 | 4=22 |
4 | 2×22=23 | 0,1,2,3,4,5,6,7 | 8=23 |
⋯ | ⋯ | ⋯ | ⋯ |
r | 2r−1 | 0,1,⋯,2r−1−1 | 2r−1 |
因为 i < n
, 即 2r−1<n ,所以 r<log2n+1 。
又因为 r 是非负整数,所以 r=⌊log2n+1⌋=⌊log2n⌋+1 (向下取整)。
第三步:基本语句频度。由上表可知,基本语句频度为:
f(n)=20+21+22+⋯+2r−1=2r−1
又因为 r=⌊log2n⌋+1 ,所以:
f(n)=2⌊log2n⌋+1−1≤2log2n+1−1=2n−1
第四步:得到时间复杂度:T(n)=O(n)
本题答案:B
本文由mdnice多平台发布