伸展樹(splay tree)是一種二叉搜尋樹,它能在o(log n)內完成插入、查詢和刪除操作。它由daniel sleator和robert tarjan創造。它的優勢在於不需要記錄用於平衡樹的冗餘資訊。在伸展樹上的一般操作都基於伸展操作。
各種二叉搜尋樹存在不足。比如:對於乙個有n個節點的平衡二叉搜尋樹,雖然最壞情況下每次查詢的時間複雜度不會超過o(logn),但是如果訪問模式不均勻,平衡樹的效率就會受到影響。此外,它們還需要額外的空間來儲存平衡資訊(結點的高度)。
伸展樹對具有「資料區域性性」的資料單元來說,最為適合。
假設想要對乙個二叉搜尋樹執行一系列的查詢操作。為了使整個查詢時間更小,被查頻率高的那些條目就應當經常處於靠近樹根的位置。於是想到設計乙個簡單方法,在每次查詢之後對樹進行重構,把被查詢的條目搬移到離樹根近一些的地方。splay tree應運而生。splay tree是一種自調整形式的二叉搜尋樹,它會沿著從某個節點到樹根之間的路徑,通過一系列的旋轉把這個節點搬移到樹根去。
搬移至樹根:在查詢完位於節點x中的條目i之後,旋轉鏈結x和其父節點的邊,然後重複這個操作直至x成為樹根。
若從空樹開始依次插入關鍵碼,且其間採用如上調整策略,
則可得到如下圖所示的二叉搜尋樹。
如此分攤下來,每次訪問平均需要n時間。
且上圖a與f中二叉搜尋樹的結構完全相同。也就是說,經過以上連續的5次訪問之後,全樹的結構將會復原!
完全可以推廣至規模任意的二叉搜尋樹。於是對於規模為任意n的伸展樹, 只要按關鍵碼單調的次序,周期性地反覆進行查詢,則無論總的訪問次數m >> n有多大,就分攤意義而言,每次訪問都將需要n時間!
雙層伸展
可見,最深節點(1)被訪問之後再經過雙層調整,不僅同樣可將該節點伸展至樹根,而且同時可使樹的高度接近於減半。就樹的形態而言,雙層伸展策略可「智慧型」地「摺疊」被訪問的 子樹分支,從而有效地避免對長分支的連續訪問。這就意味著,即便節點v的深度為n,雙層 伸展策略既可將v推至樹根,亦可令對應分支的長度以幾何級數(大致折半)的速度收縮。
資料結構 Splay伸展樹 普通平衡樹
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入 第一...
高階資料結構 線段樹
今天是很沉重的一天,進來ccf官宣取消oi,也不知道是不是真的。oier們不要放棄夢想!大家一定要勇往直前!這線段樹會很難 至少我是這麼想的 不過我也是經過百般實驗才敢寫這個部落格!假定我給你乙個定區間,讓你以最快的速度做這樣的操作 修改其中的乙個子區間,查詢另乙個子區間的值,而且重複這些操作。你會...
高階資料結構 左偏樹
我們曾經學習過基礎資料結構之一 堆 heap 堆支援三種操作 以小根堆為例 1 查詢 query 查詢堆中最小的元素 2 刪除 del 刪除堆中的任意乙個元素 3 插入 insert 插入乙個新元素 4 維護 modify 維護堆的性質 任何非葉子結點的權值都大於它的所有子結點。在刪除和插入後進行維...