试着理解Big-oh表示法

时间:2011-05-11 16:09:44

标签: big-o

您好我非常感谢Big-O符号的一些帮助。我明天有一个考试,虽然我可以定义f(x)是O(g(x))是什么,但我不能说我完全理解它。

下面的问题总是在考试中出现,我真的需要尝试弄明白,第一部分似乎很容易(我想)你只是为n选择一个值,在一个claculator上计算它们然后放入它们为了?这似乎很容易,所以我不确定。我发现很难在网上找到例子。

  

从最低到最高,是什么   正确的复杂性顺序   O(n2),O(log2 n),O(1),O(2n),O(n!),   O(n log2 n)?

     

是什么?   最糟糕的计算复杂性   二进制搜索算法   有序列表的长度n = 2k?

6 个答案:

答案 0 :(得分:3)

That guy should help you

  

从最低到最高,是什么   正确的复杂性顺序   O(n2),O(log2 n),O(1),O(2n),O(n!),   O(n log2 n)?

订单与在无穷远处比较其限制时的顺序相同。比如lim(a/b),如果它是1,那么它们是相同的,inf。或0表示其中一个更快。

  

最坏的情况是什么?   二进制的计算复杂性   搜索算法的有序列表   长度n = 2k?

  1. 查找二进制搜索最佳/最差Big-O。
  2. 按索引最佳/最差Big-O查找链接列表访问。
  3. 得出结论。

答案 1 :(得分:2)

嘿那里。如果你不真正理解“ n ”的意思,那么Big-O符号很难弄明白。你已经看到人们在谈论O( n )== O( 2n ),所以我会试着解释为什么会这样。

当我们将算法描述为具有“order- n 空间复杂度”时,我们的意思是算法使用的存储空间的大小变得更大,与问题的大小成线性关系它正在处理(称为 n 。)如果我们有一个算法,比如说,对数组进行排序,为了进行排序操作,我们在内存中做的最大的事情是创建一个该数组的精确副本,我们说它具有“order- n 空间复杂度”,因为当数组的大小(称为 n 元素)变大时,算法将占用更多空间以匹配数组的输入。因此,该算法在存储器中使用“O( n )”空间。

为什么O( 2n )= O( n )?因为当我们谈论O( n )时,我们只关注算法的行为,因为 n 变得尽可能大。如果 n 变为无穷大,则O( 2n )算法将占用内存的两倍无限空间,并且O( n )算法将占用无穷大的内存空间。由于两次无穷大只是无穷大,因此两种算法都被认为占用了足够大的空间,被称为O( n )算法。

你可能正在考虑自己“一种占用两倍于另一种算法的空间的算法仍然效率相对较低。为什么当一种算法效率更高时,它们会使用相同的符号?”因为从O( 2n )到O( n )时任意大 n 的效率增益与效率的提高绝对相形见绌当从O( n ^ 2 )到O( 500n )时,任意大 n 。当 n 为10时, n ^ 2 为10或10倍, 500n 为500倍10或5000.但我们是对 n 感兴趣,因为 n 变得尽可能大。它们交叉并在 n 500时变得相等,但再一次,我们甚至对 n 小到500感兴趣。当 n < / strong>是1000, n ^ 2 是一百万,而 500n 是“仅仅”50万。当 n 为一百万时, n ^ 2 为一千亿 - 1,000,000,000,000 - 而 500n 则以其简单的五种方式敬畏数亿 - 500,000,000 - 复杂点。再一次,我们可以继续使 n 更大,因为当使用O( n )逻辑时,我们只关注最大可能 n

(你可能会说,当 n 达到无穷大时, n ^ 2 是无穷大无穷大,而 500n 是无穷大的五百倍,并且你不是只说无穷无限的任何时候都是无限的吗?这实际上并不适用于无限时无限。我想。它只是没有。数学家可以支持我吗?)

这给我们带来了奇怪的违反直觉的结果,其中O(<七十五亿亿亿日元)被认为是对O的改进( n * log n )。由于我们正在使用任意大的“ n ”这一事实,所有重要的是在O()中出现多少次 n 。朱莉娅海沃德的帖子中提到的经验法则将帮助你,但这里有一些额外的信息可以帮助你。

一,因为n越大越好,O( n ^ 2 + 61n + 1682 )= O( n ^ 2 ),因为 n ^ 2 61n 贡献更多,因为 n 任意大, 61n 被忽略,而<强> 61n 一词已经占据 1682 一词。如果你在O()中看到了加法,那么只关注最高学位的 n

二,O( log10n )= O( log (任意数字) n ),因为任何基数 b < / strong>,log10( x )= log_ b (* x *)/ log_ b (10) 。因此,O( log10n )= O( log_b(x)* 1 /(log_b(10))。那1 / log_b(10)数字是一个常数,我们已经显示退出O( n )表示法。

答案 2 :(得分:1)

对于大O复杂性,规则是如果两个事物仅由常数因素变化,那么它们是相同的。如果一个人比另一个人更快地忽略常数因子,那么它就会更大。

所以O(2n)和O(n)是相同的 - 它们只是以常数因子(2)变化。考虑它的一种方法是删除常量,因为它们不会影响复杂性。

选择n并使用计算器的另一个问题是,它会为某些n提供错误的答案。大O是衡量n随着n增加而增长的速度的量度,但在任何给定的n时,复杂性可能不是正确的顺序。例如,在n = 2时,n ^ 2是4和n!是2,但是n!比n ^ 2增长得快一点。

重要的是要做到这一点,因为对于多个术语的运行时间,你可以删除较小的术语 - 即,如果O(f(n))是3n ^ 2 + 2n + 5,你可以放弃5 (常数),下降2n(3n ^ 2增长更快),然后下降3(常数因子)得到O(n ^ 2)...但是如果你不知道n ^ 2更大,你赢了得到正确答案。

实际上,你可以知道n是线性的,log(n)比线性增长更慢,n ^ a&gt; n ^ b如果a> b,2 ^ n比任何n ^ a快,并且n!甚至比那更快。 (提示:尽量避免在指数中包含n的算法,特别是避免使用n!的算法。)

对于问题的第二部分,在最坏的情况下,二进制搜索会发生什么?在每一步中,您将空间缩小一半,直到最终找到您的物品(或用尽的地方)。那是log2(2k)。只需遍历列表即可查找项目的搜索将需要n步。我们从第一部分就知道O(log(n))&lt; O(n),这就是二元搜索比线性搜索更快的原因。

祝你考试好运!

答案 3 :(得分:0)

非常宽松地,您可以想象选择n的极大值并计算它们。但是,对于大型因子,可能会超出计算器的范围。

如果定义不明确,则更直观的描述是“更高阶”意味着“增长得更快,因为n增长”。一些经验法则:

  • O(n ^ a)是比O(n ^ b)更高的阶数,如果a>&gt;湾
  • log(n)的增长速度比n
  • 的任何正幂都要慢
  • exp(n)的增长速度超过n
  • 的任何幂
  • N!比exp(kn)增长更快

哦,就复杂性而言,忽略常数乘数。

这足以推断正确的顺序是O(1),O(log n),O(2n)= O(n),O(n log n),O(n ^ 2),O(n !)

答案 4 :(得分:0)

以易于理解的术语,Big-O表示法定义了特定函数的增长速度。虽然它源于纯数学,但它最常用的应用是对算法的分析,可以根据输入大小进行分析,以确定必须执行的大致操作次数。

使用符号的好处是您可以根据其复杂程度对功能增长率进行分类。使用这种表示法可以用相同的复杂度表达许多不同的函数(实际上是无限数)。例如,n+52*n4*n + 1/n都具有O(n)复杂度,因为函数g(n)=n 最简单表示这些函数的方式成长。

我强调最简单,因为符号的重点在于函数的主导术语。例如,O(2*n + 5) = O(2*n) = O(n)因为n是增长中的主导词。这是因为符号假设n变为无穷大,导致剩余项在增长率中扮演较少的角色。并且,按照惯例,省略任何常数或乘法。

阅读Big O notationTime complexity以获取更多深入概述。

答案 5 :(得分:0)

请参阅this并在此处查找解决方案。

enter image description here