我在阅读关于大O表示法的内容。
所以,任何一个O(N)算法也是一个O(N^2)算法。
这对我来说似乎很令人困惑,我知道大O只提供上限。
但是,一个O(N)算法怎么可能也是一个O(N^2)算法。
是否有任何例子可以说明这种情况?
我想不出任何例子。
有人能向我解释一下吗?
我在阅读关于大O表示法的内容。
所以,任何一个O(N)算法也是一个O(N^2)算法。
这对我来说似乎很令人困惑,我知道大O只提供上限。
但是,一个O(N)算法怎么可能也是一个O(N^2)算法。
是否有任何例子可以说明这种情况?
我想不出任何例子。
有人能向我解释一下吗?
大O表示法描述的是上限,但说O(n)也是O(n^2)并不是错的。 O(n)算法是O(n^2)算法的子集。这就像正方形是所有矩形的子集一样,但并不是每个矩形都是正方形。因此从技术上讲,即使不精确,也可以说O(n)算法是O(n^2)算法。
若某个问题的时间复杂度为O(N),那么对于大N,该问题所需的时间不会超过一个固定常数k与N的乘积f(N)=k*N。但是它也比k*N^2小。因此,O(N)的含义是O(N^2),或者更普遍地说,对于所有的m>1,都有O(N^m)。
* 我假设N>=1,这在大N的情况下确实如此。
大O符号的定义:
对于任意 x >= x0
,若函数 f(x)
满足 |f(x)| <= M|g(x)|
,则称 f(x)
是 O(g(x))
。
显然,如果 g1(x) <= g2(x)
,则有 |f(x)| <= M|g1(x)| <= M|g2(x)|
。
对于只有一个循环的算法,时间复杂度为O(n),而嵌套循环的算法时间复杂度为O(n^2)。现在考虑冒泡排序算法,它使用了嵌套循环。
如果我们给冒泡排序算法一个已经排好序的输入集合,内部循环将永远不会被执行,因此对于这种情况,时间复杂度为O(n),而对于其他情况,时间复杂度为O(n^2)。
N
,那么它也必须被上限为N^2
,这是一个更高的上限。但通常情况下,如果我们可以给出一个更紧密的上限O(N)
,我们就不会报告它为O(N^2)
。 - Tim Biegeleisen