所以,我真的不会得到Big O符号。我的任务是确定此代码段的“O值”。
for (int count =1; count < n; count++) // Runs n times, so linear, or O(N)
{
int count2 = 1; // Declares an integer, so constant, O(1)
while (count2 < count) // Here's where I get confused. I recognize that it is a nested loop, but does that make it O(N^2)?
{
count2 = count2 * 2; // I would expect this to be constant as well, O(N)
}
}
答案 0 :(得分:2)
O(f(n))=g(n)
这意味着对于某些值k
,f(n)>g(n)
其中n>k
。这给出了函数g(n)
的上限。
当您被要求查找某些代码的Big O
时,
1)尝试按n
计算正在执行的计算次数,从而获得g(n)
。
2)现在尝试估计g(n)
的上限函数。这将是你的答案。
让我们将此程序应用于您的代码。
让我们计算所做的计算次数。语句declaring
和multiply by 2
需要O(1)
时间。但这些都是反复执行的。我们需要找出它们执行的次数。
外循环执行n
次。因此,第一个语句执行n
次。现在内循环执行的次数取决于n
的值。对于给定的n
值,它会执行logn
次。
现在让我们计算执行的计算总数,
log(1) + log(2) + log(3) +.... log(n) + n
请注意,最后一个n
用于第一个语句。简化上述系列我们得到:
= log(1*2*3*...n) + n
= log(n!) + n
我们有
g(n)=log(n!) + n
让我们猜测log(n!)
的上限。
从那以后,
1.2.3.4...n < n.n.n...(n times)
因此,
log(n!) < log(n^n) for n>1
暗示
log(n!) = O(nlogn).
如果您需要相关的正式证明,请检查this。由于nlogn
的增长速度超过n
,因此我们有:
O(nlogn + n) = O(nlogn)
因此,您的最终答案是O(nlogn)
。