如何计算算法的运行时间?

时间:2012-08-04 04:57:51

标签: algorithm runtime

我已经阅读了一些算法书中的算法运行时,它表示为O(n)。例如,给定代码将在O(n)时间内运行以获得最佳情况&对于最坏的情况,O(n 3 )。这是什么意思&如何为自己的代码计算它?它是否像线性时间一样,是否就像每个预定义的库函数都有自己的运行时一样,在调用它之前应该记住它?感谢...

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?

Big-O for Eight Year Olds?

答案 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课程非常适合这种事情。视频和其他材料是免费提供的,课程书(非免费)是最适合算法的书籍。