1. 程式人生 > >lighttpd 之六 伸展樹

lighttpd 之六 伸展樹

1.1  概述

       伸展樹或者分裂樹,由Daniel Sleator和Robert Tarjan創造,它的優勢在於不需要記錄用於平衡樹的冗餘資訊。

伸展樹是一種二叉排序樹,它能再O(log n)內完成插入、查詢和刪除操作。lighttpd原始碼裡關於伸展樹的程式碼不多

(對伸展樹的操作只提供了4個函式),但是因為伸展樹本身相對比較複雜,因此在此作為一章來解析,對伸展樹理

解較深的讀者可以直接跳過本章內容。

       本節相關部分原始碼:

       splaytree.h

       splaytree.c

1.2 伸展樹基礎知識

1.2.1 伸展樹介紹

        假想這麼一種情況,我們想要對一個二叉查詢樹執行一系列的查詢操作,後續會在快取器設計中看到,為了使整個

查詢時間更短,哪些查評率比較高的節點就應該經常處於比較靠近樹根的位置,於是最直觀的想法就是將每次查詢訪問節

點之後對該樹進行重構,將被查詢的節點搬移到樹根,這種自調整形式的二叉查詢樹就是伸展樹,他會沿著從某個被訪問

節點到樹根之間的路徑,通過一系列的旋轉把這個被訪問節點搬移到樹根。

        伸展樹通過一系列的旋轉把當前被訪問節點搬移到樹根,以便下次再次訪問該節點時加快速度(直接訪問根節點就被命

中或離樹根很近的位置)。為了將當前被訪問節點搬移到樹根,我們需要將沿著查詢路徑做自底向上的旋轉,直至該節點為

樹根為止(伸展樹定義的旋轉是成對進行的,伸展操作不單是把當前訪問節點搬移到樹根,而且還把查詢路徑上的每個節點

的深度都大致減掉一半)。