我已经阅读了一些算法书中的算法运行时,它表示为O(n)
。例如,给定代码将在O(n)时间内运行以获得最佳情况&对于最坏的情况,O(n 3 )。这是什么意思&如何为自己的代码计算它?它是否像线性时间一样,是否就像每个预定义的库函数都有自己的运行时一样,在调用它之前应该记住它?感谢...
答案 0 :(得分:9)
Big O Notation初学者指南可能是一个很好的起点:
http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
还要看看维基百科
http://en.wikipedia.org/wiki/Big_O_notation
stackoverflow上有几个相关问题和好答案
What is a plain English explanation of "Big O" notation?
和
答案 1 :(得分:0)
这不应该是数学吗?
如果您尝试使用冒泡排序数组进行排序,那么已对其进行排序 你可以检查,如果沿阵列移动检查任何东西。如果不是,所有的关键 - 我们完成了。
然而,对于最好的情况,你将有O(n)个评估(n-1,确切地说),对于最坏的情况(阵列被反转)你将有O(n ^ 2)个评估(n(n-1) )/ 2,确切地说)。
更复杂的例子。让我们找到数组的最大元素。 很明显,你总是会进行n-1次评估,但平均分配数量是多少? 复杂的数学答案:H(n)-1。
通常,你的答案最好和最差的场景很容易,但平均需要大量的数学。
我建议你阅读Knuth,第1卷。但谁不愿意?
并且,正式定义:
f(n)∈O(g(n))表示存在n∈N:对于所有m> n f(m)
事实上,你必须在wiki上阅读O-notation。
答案 2 :(得分:0)
big-O notation是一种渐近符号。渐近符号是一种来自数学的概念,它描述了“在极限”中的函数的行为 - 当你接近无穷大时。
定义算法运行多长时间的问题是你通常无法在几毫秒内给出答案,因为它取决于机器,你不能在时钟周期或作为操作计数给出答案,因为这对特定数据来说太具体了。
查看渐近符号的简单方法是丢弃函数中的所有常数因子。基本上,如果n足够大(假设一切都是正的),则n 2 总是大于b n。改变常数因子a和b不会改变它 - 它改变n的特定值,其中n 2 更大,但不改变它发生的情况。所以我们说O(n 2 )比O(n)大,忘记那些我们可能无法知道的常数。
这很有用,因为较大n的问题通常是那些事情慢慢下来我们真正关心的问题。如果n足够小,则所花费的时间很短,并且选择不同算法时可获得的增益很小。当n变大时,选择不同的算法会产生巨大的差异。此外,在现实世界中发生的问题通常比我们可以轻易测试的问题大得多 - 而且通常,它们会随着时间的推移而不断增长(例如,随着数据库积累更多数据)。
这是一个有用的数学模型,抽象出足够笨拙的处理细节,可以找到有用的结果,但它不是一个完美的系统。我们不处理现实世界中的无限问题,并且有很多时候问题足够小以至于这些常数与实际性能相关,有时你只需要用时钟计时。
MIT OCW Introduction to Algorithms课程非常适合这种事情。视频和其他材料是免费提供的,课程书(非免费)是最适合算法的书籍。