O(N) 算法如何也是 O(N^2) 算法?

How is O(N) algorithm also an O(N^2) algorithm?

我正在阅读大 O 表示法

So, any algorithm that is O(N) is also an O(N^2).

这让我感到困惑,我知道 Big-O 只给出上限。

但是复杂度O(N)的算法怎么可能也是复杂度O(N^2)的算法呢

有没有这样的例子?

想不出。

谁能给我解释一下?

big-O的定义:

某些函数 f(x)O(g(x)) 当且仅当 |f(x)| <= M|g(x)| 对于所有 x >= x0

显然如果 g1(x) <= g2(x) 那么 |f(x)| <= M|g1(x)| <= M|g2(x)|

Big-O 表示法描述了上界,但是说 O(n) 也是 O(n^2) 并没有错。 O(n) 算法是 O(n^2) 算法的子集。同样,正方形是所有矩形的子集,但不是每个矩形都是正方形。因此从技术上讲 O(n) 算法是 O(n^2) 算法是正确的,即使它不精确。

对于某事是O(N),这意味着对于大N,它小于函数f(N)=k*N对于一些固定的k。但它也小于 k*N^2。所以 O(N) 意味着 O(N^2),或者更一般地,对于所有 m>1.

O(N^m)

*我假设N>=1,对于大N确实是这样。

"Upper bound" 表示算法花费 不超过 (即 <=)那么长(因为输入大小趋于无穷大,具有相关的常数因子考虑过)。

这并不意味着它真的会花那么长时间。

O(n) 也是 O(n log n),O(n2),O(n3 ), O(2n) 以及任何其他渐近大于 n.

如果你熟悉相关的数学,你也可以从the formal definition看到这个。

O 表示法可以天真地读作 "less than".

在数字中,如果我告诉你 x < 4 那么显然 x<5 和 x< 6 等等。

O(n) 意味着,如果算法的输入大小为 n(n 可以是元素的数量,或者元素的大小或任何其他以数学方式描述输入大小的东西),那么算法运行 "about n iterations".

更正式的意思是算法中的步数x满足:

x < k*n + C 其中 K 和 C 是正实数

换句话说,对于所有可能的输入,如果输入的大小为n,那么算法最多执行k*n + C步。

O(n^2) 类似,除了边界是 kn^2 + C。因为 n 是自然数 n^2 >= n,所以定义仍然成立。的确如此,因为 x < kn + C 那么 x < k*n^2 + C.

所以一个O(n)算法是一个O(n^2)算法,一个O(N^3算法)和一个O(n^n)算法等等。

对于只有一个循环的算法,复杂度为 O(n),而嵌套循环的算法,复杂度为 O(n^2)。 现在考虑其中使用嵌套循环的冒泡排序算法,

如果我们将一组已经排序的输入提供给冒泡排序算法,则内部循环将永远不会执行,因此对于这样的场景,它的复杂度为 O(n),而对于其他情况,它的复杂度为 O(n^2) ).