簡體   English   中英

如何從 T(n) = 2T(n/2) + O(n) 得到 O(nlogn)

[英]How to get O(nlogn) from T(n) = 2T(n/2) + O(n)

嗨,我正在研究算法,我有一個關於在不使用主定理的情況下獲得 O(nlogn) 的問題。

我很難得到 O(nlogn)..

有誰知道從 T(n) = 2T(n/2) + O(n) 得到 O(nlogn) 的數學方法?

謝謝

注意模式(簡化一點,最好保持O(n)而不是n ):

T(n) = 2T(n/2) + n
     = 2(2T(n/4) + n/2) + n  = 4T(n/4) + n + n  = 4T(n/4) + 2n
     = 4(2T(n/8) + n/4) + 2n = 8T(n/8) + n + 2n = 8T(n/8) + 3n
     = 8(2T(n/16) + n/8)+ 3n = 8T(n/16)+ n + 3n = 16T(n/16) + 4n
     ...                                        = 32T(n/32) + 5n
     ...
                                                = n*T(1) + log2(n)*n
                                                = O(n*log2(n))

繪制遞歸樹:

樹的高度將為 log n

每個級別的成本將是 n 的常數倍

因此總成本將為 O(nlogn)。 http://homepages.ius.edu/rwisman/C455/html/notes/Chapter4/RecursionTree.htm

如果你願意,你總是可以通過歸納來證明它。

對於任何仍在弄清楚如何繪制遞歸樹的人:

圖像:T(n) = 2T(n/2) + O(n) 算法的遞歸樹

如下畫一棵樹,我們可以看到每次除以2,直到我們的葉子等於1

n/2^k = 1 
2^k = n 
k= log(n)

以上陳述證明我們的樹具有log(n)的深度。

在每個級別,我們都會執行一個花費 O(n) 的操作。

即使我們每次除以 2,我們仍然對兩個部分進行操作,因此我們在每個級別都有n次迭代。

由於我們執行它的次數等於我們的深度,因此產生的復雜度為O(nlog(n))

在此處輸入圖片說明

另外,請查看此視頻教程https://youtu.be/1K9ebQJosvo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM