【发布时间】:2012-01-28 02:50:07
【问题描述】:
for(i = 1; i <= n; i++)
{
j = n;
while(j >= 1)
{
// . . . body of the loop needs Θ(1)
j = j / 2;
}
}
【问题讨论】:
标签: time-complexity
for(i = 1; i <= n; i++)
{
j = n;
while(j >= 1)
{
// . . . body of the loop needs Θ(1)
j = j / 2;
}
}
【问题讨论】:
标签: time-complexity
我假设在这个问题中 n 已经被设置在循环之外;并且您的代码将在执行期间保持不变。
你的问题有点不清楚,但我的理解是你想知道整个代码的时间复杂度。
让我们看一下外循环。
请注意,i++ 每次将循环递增 1,并且循环上升到 n。
因为循环递增 1,所以它被称为 O(n),因为迭代次数随着 n 的值线性增长。
接下来,检查内部循环。您可以通过j = n 和while(j >= 1) 行看到循环从n 开始并下降到1。假设在while 循环中您有代码j--。这意味着内部循环的迭代次数将随着n 线性增加,就像在外部循环中一样。
然而,循环体是j = j / 2(假设这里是整数除法,也假设循环体的其余部分是 O(1) - 即它是无关紧要的)。
让我们快速看一下内部循环的n 的一些示例值:
n # while 循环的迭代次数
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
....
您可能会看到出现的模式 - 一个 1、两个 2、四个 3、八个 4。这些是 2 的幂。所以给定 n 的值,我们可以确定迭代次数:
iterations = FLOOR(Log base 2(n)) + 1.
我们需要使用FLOOR 来模拟整数除法,而+ 1 负责处理我们在j 大于或等于 1 时循环的事实。 p>
因此,迭代次数以 n 的以 2 为底的对数增长。 1 在这里不相关,因为我们对大 O 表示法感兴趣,其中常数倍数或加法对一个函数的增长没有影响相对于另一个函数的增长。
总结到目前为止:外循环以 O(n) 的速率增长,而内循环以 O(Log base 2 n) (通常只写为 Log(n)).
现在,在处理嵌套循环时,总代码的复杂度是通过乘以嵌套循环的复杂度来计算的。这是因为对于外循环的每次迭代,我们都必须完成 Log(n) 内循环。 (请参阅this question 了解更多信息)。
所以现在你可以看到你提供的 sn-p 的总复杂度是n * Log(n)。
如果您想了解有关 big-O 的更多信息,请参阅 here。
【讨论】:
enter code herei=n; enter code herewhile(i>=1){ enter code herej=i; enter code herewhile(jenter code herebody 需要 thetha(1) enter code herej=j*2; enter code here} enter code herei=i/2; enter code here} 我得到的答案是 (logn+1)(logn+2),对吗?