好的,我想没有很多参考资料或研究可以回答这个问题。相反,我花时间尝试了您的不同想法和树。我没有发现比 RB 树更好的东西,但也许这只是搜索偏差。
RB 树可以(插入)用四个简单的规则来平衡,如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
但不幸的是,Haskell 不喜欢n
. 不使用等级但更类似于 R 和 B 的 AA 树的不太标准的实现可能会很好地工作。
展开树很困难,因为您需要关注单个节点,而不是树的静态结构。它可以通过合并 insert 和 splay来完成。
Treap 在功能环境中也不容易做到,因为您没有全局随机生成器,但需要在每个节点中保留实例。这可以通过将生成优先级的任务留给客户端来解决,但即便如此,您也无法使用模式匹配进行优先级比较。