与确定 Big-O 表示法的混淆

Confusion with determining Big-O notation?

本文关键字:表示 Big-O      更新时间:2023-10-16

所以,我真的没有得到大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)
            }
    }
O(f(n))=g(n)

这意味着对于某个值kf(n)>g(n) n>k的地方。这给出了函数的上限 g(n)

当系统要求您查找某些代码的Big O时,

1)尝试根据n计算正在执行的计算次数,从而获得g(n)

2)现在尝试估计g(n)的上限函数。这将是你的答案。

让我们将此过程应用于您的代码。

让我们计算计算的次数。这些声明declaringmultiply 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).

如果你想要一个正式的证明,看看这个。由于nlogn的增长速度快于n,因此我们有:

O(nlogn + n) = O(nlogn)

因此,您的最终答案是 O(nlogn) .