我有一個我的算法類的作業問題,要求我計算一個問題的最大大小,這個問題可以用給定的操作數來解決,使用O(n log n)算法即:n log n = c)。我能夠通過近似得到答案,但有沒有一種乾淨的方法可以得到確切的答案?如何計算n log n = c
回答
這個等式沒有封閉形式的公式。基本上,可以改造等式:
n log n = c
log(n^n) = c
n^n = exp(c)
然後,該方程具有如下形式的溶液:
n = exp(W(c))
其中W是Lambert W function(特別參見 「實施例2」)。證明W
不能用基本操作表示。
但是,f(n)=n*log(n)
是一個單調函數。您可以簡單地使用二分法(在python中):
import math
def nlogn(c):
lower = 0.0
upper = 10e10
while True:
middle = (lower+upper)/2
if lower == middle or middle == upper:
return middle
if middle*math.log(middle, 2) > c:
upper = middle
else:
lower = middle
O符號只會給你方程中最大的項。即您的O(n log n)算法的性能實際上可以更好地由c =(n log n)+ n + 53表示。
這意味着,如果不知道算法性能的確切性質,無法計算處理給定數量數據所需的確切操作次數。
但是可以計算出處理大小爲n的數據集所需的最大操作數大於某個數,或者相反,使用該算法和該數可以解決的最大問題集的操作,小於一定數量。
的O表示法是用於比較2種算法是有用的,即,爲O(n^2)算法比爲O(n^3)算法等
Wikipedia看到更多的信息更快。
是的,計算「n Log [n] == c」的根不等於「計算問題的最大尺寸......」 – 2010-10-02 20:48:23
您的解釋是正確的,但對於這個特定問題,我們可以假設該算法恰好是n log n。我可能應該在問題中說明這一點。 – jlewis42 2010-10-02 20:58:49
- 1. 如何計算O(Log(N))?
- 2. 是log(n!)= O((log(n))^ 2)?
- 3. 證明log(n!)是Ω(n log(n))
- 4. 在k <n的算法運行時log(n)vs log(k)
- 5. floor(√2n)的O(log log n)算法?
- 6. 如何解決復發A(n)= A(n-1)+ n * log(n)?
- 7. 尋找關於如何計算O(n log n)的複雜度的例子?
- 8. 複製關係:T(n/16)+ n log n
- 9. 你如何看出O(log n)和O(n log n)之間的差異?
- 10. 復發:T(n)= T(n/2)+ log N
- 11. 復發T(n)= T(n - log(n))+ 1
- 12. 如何計算^(1/n)?
- 13. (log n)/(log(log n))的順序是什麼?
- 14. 中間體步驟T(N)= 2T(N/2)+ N /的log(n)
- 15. 通用實用的排序算法比O(n log n)快嗎?
- 16. 圖形搜索O(log(N)(N + M)
- 17. 是什麼小於n是log n?
- 18. inplace_merge:是什麼導致N * log(N)與N-1的複雜性?
- 19. 與log(n)相比,log(n^2)的大O是什麼?
- 20. 我該如何計算Σ_{i = m}^n(m + i)^ n?
- 21. 復發:T(n)=(2 + 1/log n)T(n/2)
- 22. 時間複雜度O(N日誌(log n)的)+ N O(L)
- 23. f(n)= n^log(n)複雜多項式或指數
- 24. 函數2log(log(n))+ 3nlog(n)+ 5log(n)的最大值是多少?
- 25. 大O符號 - O(n日誌(N))對O(的log(n^2))
- 26. 時間複雜度 - O(n^2)到O(n log n)搜索
- 27. 如何編寫時間複雜度爲O(log n)的計算m^n的迭代版本?
- 28. O(log n)中的C++ bitset邏輯運算?
- 29. 如何使用求和符號證明算法是Θ(log n)?
- 30. printf%n如何計算字符?
c/ProductLog [c]? – 2010-10-02 20:39:10