1. 程式人生 > >1008-1-鄧俊輝資料結構學習筆記 8.1-伸展樹

1008-1-鄧俊輝資料結構學習筆記 8.1-伸展樹

高階搜尋樹

文章目錄

伸展樹

對於維護平衡因子,感覺很麻煩,希望拋棄掉平衡因子,使用更加瀟灑的模式。

要求:

  1. 對於伸展樹來說,也不做過多掌握
  2. 主要明白利用資料的區域性性,我們可以實施的新策略

概述

背景知識補充: 資料區域性性

  • 剛被訪問過得資料很快會被再次訪問

因此這一次訪問過的節點,極有可能再次被訪問, 能夠實現這種特性的樹就是伸展樹–就像自適應連結串列一樣

  • 新的名詞: 自適應連結串列
    • 在某一段時間內,將經常需要訪問的元素儘可能的放到連結串列前面
    • 大概實現:就是將上次訪問過的節點移動到連結串列的前端

電腦快取會充分利用資料的區域性性, 因此電腦往往在使用一段時間後就會變的更順暢

逐層伸展

現在,我們希望通過某種手段讓BST實現諸如自適應連結串列的功能。該怎麼做? 按照慣用邏輯,我們手裡只有基本變換這唯一工具。因此我們可以使用我們的基本變換將目標節點一步一步地 往上爬,上升到根的位置。 可惜的是,這種方法在最壞情況下分攤複雜度為O(N)意味著等同線性序列,不能接受。

雙層伸展

雙層伸展通過改變zig-zig和zag-zag的方式實現畫龍點睛的作用,讓伸展樹在伸展的時候會摺疊路徑,因此, 在經過最壞情況下的一次查詢之後,新的伸展樹高度會減半。從而分攤時間複雜度達到O(logN)。

具體變換如圖所示

  • zig-zag和不同的一樣 d8ea93974814b5518728205cb654a438.jpeg
  • zig-zig改變了次序,以前是先zig p節點,然後zig g節點,現在使用倒序 f4a2905cd5643d31c162d8433d95d6dd.jpeg

有關splay還需要注意的一個地方是程式設計問題,就是樹的深度為偶數或者奇數的時候會有點小小的不一樣。 這個我們假設3,4個節點就可以具體解決。

綜合評價

  • 無需判斷平衡因子,因此也無需記錄高度,程式設計方便了一些
  • 操作的時間複雜度和AVL一樣
  • 最強優點: 在資料區域性性強的時候,經過一定使用時間後,使用伸展樹可以達到O(logK)的時間複雜度
  • 缺點: 在單次敏感的場合不適合使用