我在即将到来的期中考试中遇到了一个问题,我们将不胜感激。
请参见下面的功能
void george(int n) {
int m = n; //c1 - 1 step
while (m > 1) //c2 - log(n) steps
{
for (int i = 1; i < m; i++) //c3 - log(n)*<Stuck here>
int S = 1; //c4 - log(n)*<Stuck here>
m = m / 2; //c5 - (1)log(n) steps
}
}
由于每次迭代后i都在递增且m被2除,因此我陷入了内部for循环。
如果m = 100: 第一次迭代m = 100:循环将运行100,我迭代100次+ 1进行最后检查 第二次迭代m = 50:循环将运行50次,我将迭代50次+ 1进行最后检查 .....等等
因为m被2除,这也将被视为log(n)吗?
答案 0 :(得分:4)
外部循环执行log(n)
次
内部循环执行n + n/2 + n/4 +..+ 1 ~ 2*n
次(几何级数之和)
总时间为O(n + log(n)) = O(n)
注意-如果在内部循环中将i < m
替换为i < n
,则将获得O(n*log(n))
的复杂度,因为在这种情况下,我们对内部循环有n + n + n +.. + n
个操作,其中被加数为log(n)