算法的大O表示法

时间:2009-08-10 02:34:31

标签: c++ big-o

我无法解决问题;有人能帮助我吗?

以下声明的Big O表示法是什么: -

for (int i=2;i<=n;i=i*4)
    sum++;

7 个答案:

答案 0 :(得分:12)

一旦我成倍增长,它就是O(log(n))。

如果n大16倍,预计循环次数只会比它多两次。

答案 1 :(得分:5)

尝试计算n的一些(小)值的循环次数,然后绘制结果图(水平轴上的n,垂直轴上的循环计数)。当你第一次学习时,解决问题是很好的。

根据您为n选择的值,您可能看不到该模式。例如,对于n = 10和n = 20,循环计数是相同的。考虑到循环计数何时发生变化,也会发现一种可以告诉你大O时序的模式。

一旦您对算法时序有了更好的理解,您就不需要经历这个耗时的过程。您将能够通过代码分析以代数方式找出大O时序。

答案 2 :(得分:4)

我认为大O符号的方式是需要多长时间才能完成,这就是复杂性。例如,如果您有一个冒泡排序,当您转到要排序的项目时,需要大约n * n次操作才能完成,即O(N ^ 2)。

对于二进制搜索,当您增加n的大小时,您可以使用log2(n)操作来查找该值。由于操作次数是以log为单位,因此O(log N)用于二进制搜索(其中log是2的log)。

对于你所拥有的,增加你有N次操作(即使你偏移),因为它以线性方式增加,即O(N)。这是线性搜索的符号,因为它可能需要n / 2个选项作为平均值才能找到一个值,它仍然是O(N)。

我会看Wikipedia on O(N) notation。它有更多的技术解释,以及更多大的O符号信息。

答案 3 :(得分:3)

一旦您知道i的起点和乘数是&gt; 1,它们的确切值在big-O项中没有区别(它们只转换为添加或乘以核心组件O(log N)的常数,并且这些常量在big-O推理中被忽略 - 这就是核心点大O推理,毕竟!!!)。

答案 4 :(得分:1)

由于你是做家庭作业,你真正需要做的就是回到第一原则;即O符号的数学定义。计算出当'n'增加时有多少简单的计算步骤,以代数方式计算出限制,然后继续回答。

在实践中,大多数人根据对经典例子和经验的了解来估计“O”的复杂性。而且经常他们弄错了。

答案 5 :(得分:0)

假设“sum ++”是常数,这是一个非常合理的假设,算法是O(log 4 n)。

因为循环从2变为n,你知道它最多是O(n)。但是,因为每个循环的增量乘以4,所以在循环中花费的时间会少得多。

答案 6 :(得分:0)

i的前4个值是2,8,32,128,所以显示循环将经历多少次迭代的公式是:

((的log(n)/日志(2))/ 2)0.5