您好我非常感谢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?
答案 0 :(得分:3)
从最低到最高,是什么 正确的复杂性顺序 O(n2),O(log2 n),O(1),O(2n),O(n!), O(n log2 n)?
订单与在无穷远处比较其限制时的顺序相同。比如lim(a/b)
,如果它是1,那么它们是相同的,inf。或0表示其中一个更快。
最坏的情况是什么? 二进制的计算复杂性 搜索算法的有序列表 长度n = 2k?
答案 1 :(得分:2)
当我们将算法描述为具有“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(1),O(log n),O(2n)= O(n),O(n log n),O(n ^ 2),O(n !)
答案 4 :(得分:0)
以易于理解的术语,Big-O表示法定义了特定函数的增长速度。虽然它源于纯数学,但它最常用的应用是对算法的分析,可以根据输入大小进行分析,以确定必须执行的大致操作次数。
使用符号的好处是您可以根据其复杂程度对功能增长率进行分类。使用这种表示法可以用相同的复杂度表达许多不同的函数(实际上是无限数)。例如,n+5
,2*n
和4*n + 1/n
都具有O(n)
复杂度,因为函数g(n)=n
最简单表示这些函数的方式成长。
我强调最简单,因为符号的重点在于函数的主导术语。例如,O(2*n + 5) = O(2*n) = O(n)
因为n
是增长中的主导词。这是因为符号假设n
变为无穷大,导致剩余项在增长率中扮演较少的角色。并且,按照惯例,省略任何常数或乘法。
阅读Big O notation和Time complexity以获取更多深入概述。
答案 5 :(得分:0)
请参阅this并在此处查找解决方案。