資料結構與演算法 自適應二叉樹

2021-09-11 13:40:16 字數 1752 閱讀 3544

還記得資料結構與演算法-鍊錶(下)中的自組織鍊錶嗎?在二叉樹的組織結構中也有類似的自適應樹概念。它們都是基於乙個觀點出發而衍生出來的演算法:並非所有的元素使用的頻率都相同

例如,如果樹中第10層的乙個元素不常用,整個程式的效率將不會因訪問這一層而受到太大的影響。然而,如果要經常訪問這個元素,該元素位於第10層還是靠近根節點就有很大的區別。因此,自適應樹中的策略是沿著樹向上移動常用的元素,以此方式對樹進行重新構造,從而形成一種"優先樹"。

模擬自組織鍊錶:

根據前移法和換位法,我們為二叉樹提出兩種可行的策略

訪問過元素p之後,從p節點開始不停的旋轉,直到p節點成為新的根節點

訪問過元素p之後,將p節點圍繞其父節點旋轉一次即可,根節點除外

使用單一旋轉策略,經常訪問的元素最終上移到靠近根的地方,這樣,以後訪問會比以前的訪問更快。更重要的一點,即使所有請求的概率相同時,單一旋轉技術平均查詢時間也僅僅是 ,演算法複雜度介於o(n)o(lgn)之間,可以接受。

至於「移動到根部」策略,已經確定訪問節點的效率是(2ln2)lgn,這一結果在任何概率分布下都成立(也就是說,該結果與特定請求的概率無關)。

單一旋轉策略沒有改進的餘地,因為它的操作比較簡單,僅僅是旋轉一次即可。

"移動到根部"策略還有改進的餘地,因為在移動到根部的過程中涉及到多次旋轉。如果我們能在將節點移動到根部的過程中使二叉樹的形狀盡可能平衡,那麼總體來看效率會有很大提公升。

"移動到根部"策略的乙個修改版本稱為"張開"策略,該策略根據子節點、父節點和祖父節點之間的鏈結關係,成對地使用單一旋轉。首先,根據被訪問節點r,其父節點q及祖父節點p之間的關係,分為3種情況:

對於第一種情況,只需要旋轉r節點一次即可。

對於異構配置,首先旋轉r節點,此時,r成了新的父節點,繼續旋轉r即可。可以發現,和"移動到根部"策略是一樣的。

對於同步配置,首先旋轉r的父節點即q,然後再旋轉r節點即可。

可以發現,"移動到根部"策略和"張開"策略的差別只有一點,就是在同構配置時旋轉的方式不同。

"張開"策略偽**如下:

splaying(p, q, r) 

}複製**

事實證明,"張開"策略非常有效,既能把元素移動到根部,也能使整個樹趨於平衡,對下一次訪問元素有著積極的影響。通過計算,使用"張開"策略構造二叉樹的效率與平衡樹的效率相當,等於o(mlgn),其中m是指節點的m次訪問。

"張開"策略既關注元素的訪問頻率也兼顧到樹的平衡。在一些元素比其他元素更常用的環境中,該策略執行的很好。但是,如果靠近根部的元素與最底層元素的訪問頻率差不多,"張開"策略可能並不是最好的選擇。換而言之,我們希望有一種策略重點強調樹的平衡也能兼顧到元素的訪問頻率。這就是"半張開"策略。

"半張開"策略是"張開"策略的乙個修改版本,差別只有一點。假設已知被訪問節點r,其父節點q及祖父節點p,對於同構配置,"張開"策略需要執行兩次旋轉,最終r取代了p的位置。但是,對於"半張開"策略,只執行一次旋轉,就是將q圍繞p旋轉即可。關鍵邏輯是r節點之後不再旋轉了,q節點成了新的r節點,判斷q節點以及其父節點、祖父節點屬於同構還是異構,決定下一步的操作。

"半張開"策略的優勢在於使樹更傾向於平衡的同時兼顧到元素的訪問頻率。

以上討論的自適應樹策略既可以用到普通二叉樹也可以用到二叉查詢樹上,因為旋轉的操作不會改變二叉查詢樹的性質。

綜上所述,自適應樹是對平衡樹很好的替代方式,因為不需要專門維護樹的平衡,操作也很簡單易懂,對於中等數量的資料非常友好。

資料結構與演算法-堆

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

資料結構與演算法 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...