O(nⁿ)和O(n!)的时间复杂度

时间:2013-08-18 01:31:35

标签: big-o complexity-theory time-complexity

获取下面的复杂性顺序

O(1), O(log(n)), O(n⋅log(n)),O(n), O(n²), O(2ⁿ), O(n!), O(nⁿ), O(n³).

订单应如下:

O(1) < O(log(n)) < O(n) < O(n log n) < O(n²) < O(n³) < O(2ⁿ) < O(nⁿ) < O(n!)

在我看来,nⁿ=n⋅n⋅n⋅...
       但是,n! = n(n-1)(n-2).....所以O(n!) < O(nⁿ)

然而,另一位朋友说O(nⁿ) < O(n!)

因为n! = sqrt( 2πn ) ⋅ (n/e)ⁿ

我不知道怎么弄这个,请详细解释一下。

2 个答案:

答案 0 :(得分:2)

公式n! ≈ sqrt( 2πn ) ⋅ (n/e)ⁿ称为Stirlings approximation 但是,如果你知道O(n!) < O(nⁿ)sqrt(n)下降慢得多((1/e)ⁿ增长),这也会显示n。 (limn → ∞ sqrt(n) / eⁿ = 0)。所以

O(n!) = O(sqrt(n) ⋅ (1/e)ⁿ ⋅ nⁿ) < O(nⁿ)

holdes,因为sqrt(n) ⋅ (1/e)ⁿ远小于1,大约为O((1/e)ⁿ)

但这个公式只是一个近似值。如你所说:

nⁿ = n ⋅ n ⋅ ... ⋅ n   (n times)  
n! = n ⋅ (n-1) ⋅ ... ⋅ 2 ⋅ 1 
   < n ⋅ n ⋅ ... ⋅ n = nⁿ

这应该表明O(n!) < O(nⁿ)

答案 1 :(得分:0)

假设N = 4。

  • 如果你调用O(N!),循环将迭代N!每个循环的时间。第一个循环为1,第二个循环为1,2,第三个循环为1,2,3,第四个循环为1,2,3,4。
  • 所以你有:
  • 1
  • 1,2
  • 1,2,3
  • 1,2,3,4
  • 如果你调用O(N ^ N),循环将为每个循环迭代N次。第一个循环将是1,2,3,4,第二个循环将是1,2,3,4,第三个循环将是1,2,3,4,第四个循环将是1,2,3,4
  • 所以你有:
  • 1,2,3,4
  • 1,2,3,4
  • 1,2,3,4
  • 1,2,3,4
  • 因此,您可以看到O(N!)将比O(N ^ N)更早终止,因为它不必循环到每次迭代的列表末尾。因此,时间复杂度O(N!)&lt; O(N ^ N)或更确切地说O(N!)优于O(N ^ N)。