问题
大家好,我正在尝试理解'大O符号'中的复杂度顺序。我阅读了许多文章,但还没有找到任何解释'复杂度顺序'的内容,即使在这里有用的大O描述也是如此。
我已经理解的关于大O的部分
我已经理解的部分是,我们通过输入大小n的增长来衡量算法的时间和空间复杂度。我也知道某些排序方法对于大O有最佳、最坏和平均情况,例如O(n)、O(n^2)等,其中n是输入大小(要排序的元素数量)。
希望能够提供简单的定义或示例,非常感谢。
问题
大家好,我正在尝试理解'大O符号'中的复杂度顺序。我阅读了许多文章,但还没有找到任何解释'复杂度顺序'的内容,即使在这里有用的大O描述也是如此。
我已经理解的关于大O的部分
我已经理解的部分是,我们通过输入大小n的增长来衡量算法的时间和空间复杂度。我也知道某些排序方法对于大O有最佳、最坏和平均情况,例如O(n)、O(n^2)等,其中n是输入大小(要排序的元素数量)。
希望能够提供简单的定义或示例,非常感谢。
大 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
找到一个能够在超线性时间或更短时间内运行的算法,可以极大地提高应用程序的性能。
f(n)在O(g(n))
中,当且仅当存在一个C和n0, 使得对于所有大于n0的n, 都有 f(n) < C*g(n)
。其他人已经在这里很好地解释了大O符号。我想指出有时候过分强调大O符号。
考虑矩阵乘法,朴素算法的复杂度为O(n^3)。使用Strassen算法可以将其降为O(n^2.807)。现在甚至有算法可以得到O(n^2.3727)。
你可能会被诱惑选择具有最低大O的算法,但实际上,朴素的O(n^3)方法胜出。这是因为其他方法的主导项常数要大得多。
因此,仅仅看复杂度中的主导项可能会误导人。有时候必须考虑所有项。
我看到你在评论中想要了解与Big-O相关的特定顺序术语。
假设f(n)= O(n ^ 2)
,我们说顺序是n ^ 2
。
大 O 使用数学定义复杂度。
工业中使用的复杂度顺序。