好吧,我想沒有太多的參考或研究回答這個問題。相反,我花時間嘗試了不同的想法和樹木。我沒有發現比RB樹更好的東西,但也許這只是搜索偏好。
的RB樹可以是(插入)有四個簡單的規則平衡,如shown by Chris Okasaki:
balance T (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d)
balance T (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)
balance T a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)
balance T a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d)
balance T a x b = T B a x b
AVL樹可以以類似的模式匹配方式來平衡。但是規則不壓縮,以及:
balance T (T (T a x b dx) y c (-1)) z d (-2) = T (T a x b dx) y (T c z d 0) 0
balance T a x (T b y (T c z d dz) 1) 2 = T (T a x b 0) y (T c z d dz) 0
balance T (T a x (T b y c 1) 1) z d (-2) = T (T a x b -1) y (T c z d 0) 0
balance T (T a x (T b y c (-1)) 1) z d (-2) = T (T a x b 0) y (T c z d 1) 0
balance T (T a x (T b y c _) 1) z d (-2) = T (T a x b 0) y (T c z d 0) 0
balance T a x (T (T b y c 1) z d (-1)) 2 = T (T a x b -1) y (T c z d 0) 0
balance T a x (T (T b y c (-1)) z d (-1)) 2 = T (T a x b 0) y (T c z d 1) 0
balance T a x (T (T b y c _) z d (-1)) 2 = T (T a x b 0) y (T c z d 0) 0
balance t = t
至於通常被認爲是AVL樹縫遜色於RB樹,他們很可能不值得額外的麻煩。
AA樹木理論上可以平衡好的,很容易:
balance T n (T n a x b) y c = T n a x (T n b y c) -- skew
balance T n a x (T n b y (T n c z d)) = T (n+1) (T n a x b) y (T n c z d) --split
balance T n a x b = T n a x b
但遺憾的是哈斯克爾不喜歡n
超載。 AA樹的不太標準的實現可能不是使用等級,而是更類似於R和B的東西,可能會運行良好。
Splay樹很困難,因爲您需要關注單個節點,而不是樹的靜態結構。它可以通過merging insert and splay完成。因爲您沒有全局隨機生成器,但需要在每個節點中保留實例,因此在功能環境中也會遇到困難。這可以通過leaving the task of generating priorities to the client來解決,但即使如此,您也無法使用模式匹配進行優先級比較。
不是直接的答案,而是閱讀「純功能數據結構」以獲得一些好的想法。 – 2010-11-12 15:25:15
我喜歡它。它沒有涉及到詳細的結構,但提供了一個很好的一般觀點。 – 2010-11-12 17:02:07
你需要一個搜索樹,或者一個序列的樹形表示(如fingertrees - 連接和分裂)?在後一種情況下,純功能2-3樹是微不足道的。 – jkff 2010-11-18 06:20:31