[英]How does this algorithm have complexity of O(n^2)?
設 v 是樹 T 的一個節點。節點 v 的深度可以定義如下:
基於上述定義,遞歸算法深度,如下面的算法所示,通過在 v 的父節點上遞歸調用自身,並將返回的值加 1 來計算 Tree 的節點 v 的深度。
depth(T, y)
:T.isRoot(v)
,則返回1
1 + depth(T, T. parent(v))
樹 T 的高度等於 T 的外部節點的最大深度。雖然這個定義是正確的,但它不會導致有效的算法。 事實上,如果我們將上述深度尋找算法應用於樹 T 中的每個節點,我們將推導出一個 O(n 2 ) 時間算法來計算 T 的高度。
根據上面的說法,它怎么可能是 O(n 2 )? 如果我們在每個外部節點上嘗試這個算法,那么它需要 O(n),並且要找到最大值需要 O(n)。 所以總復雜度應該是O(n)+O(n) = O(2n)==O(n),對吧?
該算法的最壞情況是不平衡的樹。 例如,如下圖所示的一棵樹:
上面的樹有 5 個外部節點和 5 個內部節點,所以正好有一半的節點是外部節點。 從 A 開始,有一個父級。 從 B 開始,有 2 個,依此類推。所以訪問的父母( P
)的總數是1+2+3+...+(n/2)
。
使用自然數和的公式,我們有P = (n/2)(n/2 + 1)/2 = (n^2 + 2n)/8
。 忽略常數因子 (8) 和次要項 (2n),我們看到P
為 O(n^2)。
如果我們在每個外部節點上嘗試這個算法,那么它需要 O(n)
這是不正確的。 您將應用該算法n
次,其中每次調用需要O(n)
時間,總共需要O(n^2)
時間。
這當然是假設結果沒有緩存/記憶(所以我們做了很多重復的工作)。 如果有,那么總共確實是O(n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.