for(i = 1; i <= n; i++)
{
j = n;
while(j >= 1)
{
// . . . body of the loop needs Θ(1)
j = j / 2;
}
}
答案 0 :(得分:2)
我在这个问题中假设n已经被设置在循环之外;并且您的代码在执行期间将保持不变。
你的问题有点不清楚,但我的理解是你想知道整个代码的时间复杂性。
让我们来看看外循环。
请注意,i++
每次将循环递增1并且循环上升到n
。
因为循环递增1,所以当迭代次数与n
的值线性增长时,它被称为O(n)。
接下来,检查内循环。您可以通过行j = n
和while(j >= 1)
看到循环从n开始并向下变为1.假设在while循环内部您有代码j--
。这意味着内循环的迭代次数将与n
呈线性增长,就像在外循环中一样。
然而,循环的主体是j = j / 2
(假设这里是整数除法,也可以通过你的注释假设循环体的其余部分是O(1) - 即它是无关紧要的)。
让我们快速浏览内循环的n
的一些示例值:
n
#multi循环的迭代次数
1 1
2 2
3 2
4 3
5 3
6 3
7 3
8 4
9 4
10 4
11 4
12 4
13 4
14 4
15 4
...
你可能会看到出现的模式 - 一个,两个2,四个3,八个4。这些是2的幂。因此,给定n
的值,我们可以确定迭代次数:
iterations = FLOOR(Log base 2(n)) + 1
。
我们需要使用FLOOR
来模拟整数除法,+ 1
负责处理j
大于或等于{ b> 1。
因此,迭代次数增加了n的Log base 2。 1与此无关,因为我们对big-O表示法感兴趣,其中常数倍数或加法对一个函数相对于另一个函数的增长的增长没有影响。
总结到目前为止:外环以 O (n)的速度增长,而内环在 O (Log base 2 n)增长>(通常只写为Log(n))。
现在,在处理嵌套循环时,通过将嵌套循环的复杂性相乘来找到总代码的复杂性。这是因为对于外循环的每次迭代,我们必须完成Log(n)内循环。 (有关详细信息,请参阅this question。)
现在您可以看到,您提供的代码段的总复杂程度为n * Log(n)
。
如果您想了解有关big-O的更多信息,请参阅here。