问题
您好我正在努力了解Big O表示法的复杂程度。我已阅读了很多文章,但我还没有找到任何解释'复杂程度'的内容,即使是在这里对Big O的有用描述也是如此。
我已经了解大O
我已经理解的部分。关于Big O表示法是我们根据输入大小n的增长来测量算法的时间和空间复杂度。我也理解某些排序方法有Big O的最佳,最差和平均场景,如O(n),O(n ^ 2)等,n是输入大小(要排序的元素数)。
非常感谢任何简单的定义或示例。
答案 0 :(得分:10)
Big-O分析是运行时分析的一种形式,它根据算法作为输入大小的函数运行所花费的时间来衡量算法的效率。它不是一个正式的基准,只是在处理非常大的输入大小时通过相对效率对算法进行分类的简单方法。
更新: 任何运行时分析的最快运行时间是O(1),通常称为恒定运行时间。具有恒定运行时间的算法总是需要相同的时间 无论输入大小如何,都可以执行。这是算法的理想运行时间,但很少能实现。 大多数算法的性能取决于n,输入的大小。算法可以从最差到最差的性能分类如下:
O(log n) - 如果算法的运行时间与输入大小成比例地增加,则称算法是对数的。
O(n) - 线性算法的运行时间与输入大小成正比增加。
O(n log n) - 超线性算法位于线性算法和多项式算法之间。
O(n ^ c) - 多项式算法根据输入的大小快速增长。
O(c ^ n) - 指数算法比多项式算法的增长速度更快。
O(n!) - 因子算法增长最快,即使很小的n值也很快无法使用。
当n变大时,不同算法顺序的运行时间快速分开。考虑每个算法类的运行时间
n = 10:
log 10 = 1
10 = 10
10 log 10 = 10
10^2 = 100
2^10= 1,024
10! = 3,628,800
Now double it to n = 20:
log 20 = 1.30
20 = 20
20 log 20= 26.02
20^2 = 400
2^20 = 1,048,576
20! = 2.43×1018
找到一个在超线性时间或更好的时间工作的算法可以对应用程序的执行情况产生巨大的影响。
答案 1 :(得分:6)
说,f(n) in O(g(n))
当且仅当存在C和n0时,所有n的f(n) < C*g(n)
大于n0。
现在这是一种相当数学的方法。所以我举一些例子。最简单的情况是O(1)。这意味着“不变”。因此,无论程序的输入(n)有多大,都需要相同的时间才能完成。常量程序的一个例子是获取整数列表并返回第一个整数。无论列表有多长,您都可以先拿第一个并立即归还。
接下来是线性的,O(n)。这意味着如果程序的输入大小加倍,执行时间也会增加。线性程序的一个例子是整数列表的总和。你必须看一次每个整数。因此,如果输入是大小为n的列表,则必须查看n个整数。
直观的定义可以将程序的顺序定义为输入大小和执行时间之间的关系。
答案 2 :(得分:4)
其他人在这里很好地解释了大O符号。我想指出的是,有时过分强调大O符号。
考虑矩阵乘法,天真算法具有O(n ^ 3)。使用Strassen算法可以将其作为O(n ^ 2.807)。现在甚至有算法得到O(n ^ 2.3727)。
人们可能会想要选择具有最低大O的算法但是为了所有实际目的而转向天真的O(n ^ 3)方法胜出。这是因为对于其他方法,支配期限的常数要大得多。
因此,仅仅考虑复杂性中的主导术语可能会产生误导。有时必须考虑所有条款。
答案 3 :(得分:2)
大O是为了找到一些功能增长的上限。请参阅维基百科上的正式定义http://en.wikipedia.org/wiki/Big_O_notation
因此,如果您有一个算法可以对大小为n
的数组进行排序,并且它只需要一定量的额外空间并且需要(例如)2 n² + n
步骤来完成,那么您会说它的空间复杂度是O(n)
或O(1)
(取决于您是否计算输入数组的大小),它的时间复杂度为O(n²)
。
只知道那些O
个数字,您可以大致确定从n
到n + 100
或2 n
或您感兴趣的任何内容需要多少空间和时间in。这就是算法“扩展”的程度。
<强>更新强>
大O和复杂性实际上只是同一件事的两个术语。您可以说“线性复杂度”而不是O(n)
,二次复杂度而不是O(n²)
等等。
答案 4 :(得分:2)
我看到您正在评论几个想要了解与Big-O相关的特定订单条款的答案。
假设f(n) = O(n^2)
,我们说订单是n^2
。
答案 5 :(得分:1)
这里要小心,有一些细微之处。您说“我们正在根据输入大小n的增长来衡量算法的时间和空间复杂度”,这就是人们经常对待它的方式,但实际上并不正确。相反,对于O(g(n)),我们确定g(n),适当缩放,对于所有大小为n的输入大于的算法的时间和空间复杂度是上界某些特别的n'。类似地,对于Omega(h(n)),我们确定h(n),适当缩放,对于所有大小为n的输入大于的算法的时间和空间复杂度是下界某些特别的n'。最后,如果下限和上限都是相同的复杂度g(n),则复杂度为Theta(g(n))。换句话说,Theta表示算法的复杂程度,而big-O和big-Omega将其限制在上下。