回答
之所以O(log(n!)) = O(nlog(n))
是由兩部分組成的答案。一是擴大O(log(n!))
,
log(1) + log(2) + ... + log(n)
我們既可以在這裏同意log(1)
,log(2)
,和所有的數字高達log(n-1)
都小於log(n)
。因此,下面的不等式可以製成,
log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n)
現在的答案的另一半取決於一個事實,即從1到n的數字的一半是小於n/2大。這意味着,log(n!)
將比n/2*log(n/2)
又名總和log(n!)
的前半部分較大,
log(1) + log(2) + ... + log(n) => log(n/2) + log(n/2) + ... + log(n/2)
原因是,的log(1) + log(2) + ... + log(n)
上半年log(1) + log(2) + ... + log(n/2)
,其小於n/2*log(n/2)
作爲證明由第一不等式,從而通過加上總和log(n!)
的後半部分,可以證明它大於n/2*log(n/2)
。
所以這兩個不等式,它可以證明O(log(n!)) = O(nlog(n))
你不需要斯特林是什麼?簡單的對數規則和O定義。但我想知道爲什麼在這種情況下指定複雜度爲O(log n!)是不常見的。通常人們使用O符號來表示「這大致是操作次數」,雖然它不準確。換句話說,通常使用O(log n!)的算法可能比O(n log n)中的一個更好。 – rapt
@rapt我認爲你得到的是'log(n!)'可能比'n log(n)'更尖銳。但在世界上,如果大O,這是完全不是這樣的。 'O(log(n!))'確實等於'O(n log(n))'這裏證明了這一點:http://stackoverflow.com/questions/8118221/what-is-ologn-and-on-and -stirling-approximation我認爲'O(n log(n))'是首選的原因是因爲人們發現它更容易掌握。 – wookie919
是的。但正如我多次說過的那樣,大O表示法被非正式地用來顯示實際的時間複雜度,由於它只是時間複雜度的上限,所以它不是很準確。無論如何,這是一個很好的答案。謝謝。 – rapt
- 1. 排序時間複雜度
- 2. 合併排序的時間複雜度
- 3. Shell排序的時間複雜度?
- 4. C++排序向量時間複雜度
- 5. 排序算法的時間複雜度
- 6. 最小生成樹時間複雜度
- 7. 插入排序/堆排序時間複雜度
- 8. 時間複雜度
- 9. 時間複雜度
- 10. 時間複雜度
- 11. 時間複雜度
- 12. 時間複雜度和空間複雜度,如何計算空間複雜度
- 13. 使用Knuth序列的Shell排序的時間複雜度?
- 14. 分時排序算法的時間複雜度是多少?
- 15. 二叉樹O(n)的InOrder樹遍歷的時間複雜度?
- 16. 前綴樹的空間複雜度
- 17. C程序的時間複雜度
- 18. 以升序時間複雜度
- 19. 程序的時間複雜度
- 20. c程序的時間複雜度
- 21. 降低程序的時間複雜度
- 22. 程序的時間複雜度?
- 23. 2^N數組插入排序的時間複雜度?
- 24. 快速排序最差情況下的時間複雜度?
- 25. 二進制搜索未排序數組的時間複雜度
- 26. 分析堆棧排序算法的時間複雜度
- 27. 計數排序O(n + k)時間複雜度是什麼k?
- 28. 睡眠排序的時間複雜度是多少?
- 29. 時間複雜度:使用唯一鍵的插入排序
- 30. 合併排序時間複雜度與我的算法。大O
爲什麼O定義需要第二個不等式?另外,我認爲維基百科中的解釋是誤導性的:在實踐中,複雜性是log(n!)。它不會比log(n^n)更糟糕的事實很酷,但我們也可以說它不會比log(n^n^n)更糟糕。 – rapt
@rapt,因爲根據大O符號,下界的'n/2 * log(n/2)'和'nlog(n)'是一樣的,所以你有不等式'O(nlog(n))< = O(log(n!)<= O(nlog(n))' –
這是真的,但是當我看大O符號的正式定義時,看起來第一個不平等就是所有要表明的'log(n!)= O(n log(n))'無論如何,這是一個很好的簡單解釋,它提醒了我一些細節;並確認當前維基百科「樹排序」條目不太準確。 – rapt