【Splay 總結】


 

很多年前學的splay已經忘了?

BZOJ 3729 要用Splay啊哭。。強制在線。。


 

二叉查找樹

  二叉排序樹(Binary Sort Tree)又稱二叉查找樹(Binary Search Tree),亦稱二叉搜索樹。

  

  二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
  (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;
  (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
  (3)左、右子樹也分別為二叉排序樹;
 
  二叉查找樹的優化: Size Balanced Tree(SBT)  、 AVL樹  、紅黑樹 、Treap(Tree+Heap) 。。。。
            這些均可以使查找樹的高度為O(log(n))
 
伸展樹

  伸展樹是二叉查找樹的一種改進,與二叉查找樹一樣,伸展樹也具有有序性。
  即伸展樹中的每一個節點x都滿足:該節點左子樹中的每一個元素都小於x,而其右子樹中的每一個元素都大於x。

  與普通二叉查找樹不同的是,伸展樹可以自我調整,這就要依靠伸展操作Splay(x,S)。

 

旋轉

1.zig

 

              當目標節點為根節點的左/右節點時,進行單旋轉。

2.zig-zag:

 

                當目標節點與父節點和祖父節點構成zig-zag時,進行雙旋轉。

 

3.zig-zig:

 

                  當目標節點有父節點和祖父節點構成zig-zig時,進行一次zig-zig操作

 

單旋轉操作效果(以右單旋轉為例):

  

  

雙旋轉操作效果:

 

 

  

Zig-zig操作效果:

 

Splay tree中,zig-zig操作基本上代替的AVL tree 中的單旋轉。

 

 

伸展樹的基本操作
利用Splay操作,我們可以在伸展樹S上進行如下運算:


(1)Find(x,S):判斷元素x是否在伸展樹S表示的有序集中。
首先,與在二叉查找樹中的查找操作一樣,在伸展樹中查找元素x。如果x
在樹中,則再執行Splay(x,S)調整伸展樹。


(2)Insert(x,S):將元素x插入伸展樹S表示的有序集中。
首先,也與處理普通的二叉查找樹一樣,將x 插入到伸展樹S中的相應位置
上,再執行Splay(x,S)。


(3)Delete(x,S):將元素x從伸展樹S所表示的有序集中刪除。
首先,用在二叉查找樹中查找元素的方法找到x的位置。如果x沒有孩子或
只有一個孩子,那么直接將x刪去,並通過Splay操作,將x節點的父節點調整
到伸展樹的根節點處。否則,則向下查找x的后繼y,用y替代x的位置,最后
執行Splay(y,S),將y調整為伸展樹的根。


(4)Join(S1,S2):將兩個伸展樹S1與S2合並成為一個伸展樹。其中S1的所
有元素都小於S2的所有元素。
首先,我們找到伸展樹S1 中最大的一個元素x,再通過Splay(x,S1)將x 調
整到伸展樹S1 的根。然后再將S2 作為x 節點的右子樹。這樣,就得到了新的
伸展樹S。如圖所示

(5)Split(x,S):以x 為界,將伸展樹S 分離為兩棵伸展樹S1 和S2,其中S1
中所有元素都小於x,S2中的所有元素都大於x。
首先執行Find(x,S),將元素x 調整為伸展樹的根節點,則x 的左子樹就是
S1,而右子樹為S2。如圖所示

 

 

除了上面介紹的五種基本操作,伸展樹還支持求最大值、求最小值、求前趨、
求后繼等多種操作,這些基本操作也都是建立在伸展操作的基礎上的。

 

 

Splay模板題

[BZOJ3223] Tyvj 1729 文藝平衡樹 關於翻轉標記 
[BZOJ3224] Tyvj 1728 普通平衡樹平衡樹基本操作 
[BZOJ1503] [NOI2004]郁悶的出納員帶+-標記的平衡樹 
[BZOJ1208] [HNOI2004]寵物收養所 
[BZOJ1251] 序列終結者注意標記下放的過程

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM