题目
试分析下面各程序段的时间复杂度。x=n; /n>1y=0;while(x≥(y+1)* (y+1))y++;A. O(1) B. O(n) C. O(n!) D. O(sqrt (n))
试分析下面各程序段的时间复杂度。
x=n; //n>1
y=0;
while(x≥(y+1)* (y+1))
y++;
A. O(1)B. O(n)
C. O(n!)
D. O(

题目解答
答案
D
解析
考查要点:本题主要考查对循环时间复杂度的分析能力,需要根据循环条件确定循环次数,并将其转化为数学表达式,进而推导出渐进时间复杂度。
解题核心思路:
- 循环条件分析:循环条件为
x ≥ (y+1)*(y+1)
,即y+1 ≤ √x
。 - 循环变量变化:每次循环
y
增加 1,直到y+1 > √x
时终止。 - 循环次数计算:循环次数为满足
y+1 ≤ √x
的最大整数y
,即y ≈ √x - 1
。 - 时间复杂度推导:由于
x = n
,循环次数与√n
成正比,因此时间复杂度为 O(√n)。
循环条件变形:
循环条件 x ≥ (y+1)*(y+1)
可改写为 y+1 ≤ √x
。
当 y
从 0 开始递增时,循环将执行到 y+1 > √x
时终止。
循环次数计算:
设初始 x = n
,则循环终止时满足:
$y+1 > \sqrt{n} \quad \Rightarrow \quad y > \sqrt{n} - 1$
因此,循环次数为 ⌊√n⌋
(向下取整)。
时间复杂度分析:
循环次数与 √n
成正比,故时间复杂度为 O(√n)。