lighttpd 之六 伸展樹
阿新 • • 發佈:2018-12-11
1.1 概述
伸展樹或者分裂樹,由Daniel Sleator和Robert Tarjan創造,它的優勢在於不需要記錄用於平衡樹的冗餘資訊。
伸展樹是一種二叉排序樹,它能再O(log n)內完成插入、查詢和刪除操作。lighttpd原始碼裡關於伸展樹的程式碼不多
(對伸展樹的操作只提供了4個函式),但是因為伸展樹本身相對比較複雜,因此在此作為一章來解析,對伸展樹理
解較深的讀者可以直接跳過本章內容。
本節相關部分原始碼:
splaytree.h
splaytree.c
1.2 伸展樹基礎知識
1.2.1 伸展樹介紹
假想這麼一種情況,我們想要對一個二叉查詢樹執行一系列的查詢操作,後續會在快取器設計中看到,為了使整個
查詢時間更短,哪些查評率比較高的節點就應該經常處於比較靠近樹根的位置,於是最直觀的想法就是將每次查詢訪問節
點之後對該樹進行重構,將被查詢的節點搬移到樹根,這種自調整形式的二叉查詢樹就是伸展樹,他會沿著從某個被訪問
節點到樹根之間的路徑,通過一系列的旋轉把這個被訪問節點搬移到樹根。
伸展樹通過一系列的旋轉把當前被訪問節點搬移到樹根,以便下次再次訪問該節點時加快速度(直接訪問根節點就被命
中或離樹根很近的位置)。為了將當前被訪問節點搬移到樹根,我們需要將沿著查詢路徑做自底向上的旋轉,直至該節點為
樹根為止(伸展樹定義的旋轉是成對進行的,伸展操作不單是把當前訪問節點搬移到樹根,而且還把查詢路徑上的每個節點
的深度都大致減掉一半)。