簡體   English   中英

該算法的復雜度如何為 O(n^2)?

[英]How does this algorithm have complexity of O(n^2)?

設 v 是樹 T 的一個節點。節點 v 的深度可以定義如下:

  • 如果 v 是根,則 v 的深度為 1。
  • 否則,v 的深度是 1 加上 v 的父級的深度。

基於上述定義,遞歸算法深度,如下面的算法所示,通過在 v 的父節點上遞歸調用自身,並將返回的值加 1 來計算 Tree 的節點 v 的深度。

算法depth(T, y)

  • 第 1 步:如果T.isRoot(v) ,則返回1
  • 第 2 步:否則,返回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)

在漸近符號中, n^2可能意味着,對於每個節點,您訪問的節點數量可變,最大nn - 1 讓我們考慮一下:

一顆樹

當您為節點1調用遞歸 function 時,它會立即返回,但是當您為節點5調用它時,您需要重新計算所有節點的深度,直到節點 1 ,這意味着您訪問了所有其他節點,因為您沒有使用記憶. 因此,對於您正在訪問的每個節點 [1 到 n-1] 個節點。

暫無
暫無

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

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