与确定 Big-O 表示法的混淆
Confusion with determining Big-O notation?
所以,我真的没有得到大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)
这意味着对于某个值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).
如果你想要一个正式的证明,看看这个。由于nlogn
的增长速度快于n
,因此我们有:
O(nlogn + n) = O(nlogn)
因此,您的最终答案是 O(nlogn)
.
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 嵌套在循环中的两个循环的 big-O 表示法
- 此代码的 Big-O 表示法是什么?
- 对于记忆递归和迭代,Big O表示法相同吗
- 这段代码的 Big-O 表示法是什么
- 用 Big-O 表示法弄清楚我的程序的算法复杂性
- 与确定 Big-O 表示法的混淆
- 如何找到循环下FFT乘法的Big-O表示法
- 在 Big O 表示法中,您如何考虑对其他方法的调用