【问题标题】:Which is easier to implement: 2-3-4 Tree or Red-Black Tree?哪个更容易实现:2-3-4 树还是红黑树?
【发布时间】:2012-01-30 21:47:35
【问题描述】:

我从 (Lafore) 学习的教科书首先介绍了红黑树,并且不包含任何伪代码,尽管所介绍的相关算法看起来相当复杂,有许多独特的案例。

接下来,他介绍了 2-3-4 树,在我看来,这些树似乎更易于理解,而且我猜想实现起来更简单。他包含了一些非常清晰的实际 Java 代码。他似乎暗示 2-3-4 更容易实现,根据我目前所见,我会同意。

然而,*却说相反……我认为这可能是不正确的:

http://en.wikipedia.org/wiki/2-3-4_tree

2-3-4 树是红黑树的等距,这意味着它们是 等价的数据结构。换句话说,对于每棵 2-3-4 树, 至少存在一棵带有数据元素的红黑树 相同的顺序。此外,对 2-3-4 树的插入和删除操作 导致节点扩展、拆分和合并的等价于 红黑树中的颜色翻转和旋转。简介 红黑树通常首先引入 2-3-4 树,因为它们是 概念上更简单。 但是,2-3-4 树可能很难 在大多数编程语言中实现,因为大量 树上的操作涉及的特殊情况。红黑树是 更容易实现,所以倾向于被使用。

具体来说,关于“大量特殊情况”的部分对我来说似乎很落后(我认为是RB有大量特殊情况,而不是2-3-4)。但是,我仍在学习(老实说,我还没有完全了解红黑树),所以我很想听听其他意见。

作为旁注...虽然我同意 Lafore 所说的大部分内容,但我认为有趣的是,与 Wikipedia 所说的常见(RB 之前的 2-3-4)相比,他以相反的顺序呈现它们。我确实认为首先 2-3-4 会更有意义,因为 RB 更难以概念化。也许他选择了这个顺序,因为 RB 与他在上一章刚刚完成的 BST 的关系更密切。

【问题讨论】:

  • 我不确定哪个更容易实现,但this 可能会有所帮助。
  • 这似乎很主观,所以也许您可以编辑问题以更具体地说明什么构成“更容易”。也许只是需要考虑的特殊情况的数量?
  • 我明白你在说什么,但是我提到的*和教科书都使用了相同的通用性......即仅根据“易用性”或“简单性”比较两种不同算法的实现。 "我猜想量化这样一个模糊词的指标的一个想法是 SLOC。另一个是“易于理解”,这确实是主观的......但我认为大多数情况下这个指标是正确的:更少的 SLOC = 更容易理解。

标签: data-structures b-tree red-black-tree


【解决方案1】:

关于“大量特殊情况”的部分对我来说似乎很落后(我认为是RB有大量特殊情况,而不是2-3-4)

如果你的语言中有模式匹配,RB 树可以用十几行来实现:

data Color = R | B
data Tree a = E | T Color (Tree a) a (Tree a)

balance :: Color -> Tree a -> a -> Tree a -> Tree a
balance B (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 B (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 B 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 B 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 col a x b = T col a x b

insert :: Ord a => a -> Tree a -> Tree a
insert x s = T B a y b where
  ins E          =  T R E x E
  ins s@(T col a y b) 
    | x < y      =  balance col (ins a) y b
    | x > y      =  balance col a y (ins b)
    | otherwise  =  s
  T _ a y b = ins s

这个著名的定义from Okasaki's paper

【讨论】: