Data structures 哪个更容易实现:2-3-4树还是红黑树?

Data structures 哪个更容易实现:2-3-4树还是红黑树?,data-structures,b-tree,red-black-tree,Data Structures,B Tree,Red Black Tree,我正在学习的教科书(Lafore)首先介绍了红黑树,并且没有包含任何伪代码,尽管所介绍的相关算法似乎相当复杂,有许多独特的情况 接下来,他展示了2-3-4棵树,在我看来,它们更容易理解,我猜,也更容易实现。他包含了一些非常清晰的实际Java代码。他似乎暗示2-3-4更容易实现,根据我目前所看到的情况,我会同意 然而,维基百科的说法正好相反。。。我认为这可能是不正确的: 2-3-4树是红黑树的等距图,这意味着它们是 等效数据结构。换句话说,每2-3-4棵树, 中至少存在一个包含数据元素的红黑树

我正在学习的教科书(Lafore)首先介绍了红黑树,并且没有包含任何伪代码,尽管所介绍的相关算法似乎相当复杂,有许多独特的情况

接下来,他展示了2-3-4棵树,在我看来,它们更容易理解,我猜,也更容易实现。他包含了一些非常清晰的实际Java代码。他似乎暗示2-3-4更容易实现,根据我目前所看到的情况,我会同意

然而,维基百科的说法正好相反。。。我认为这可能是不正确的:

2-3-4树是红黑树的等距图,这意味着它们是 等效数据结构。换句话说,每2-3-4棵树, 中至少存在一个包含数据元素的红黑树 同样的顺序。此外,在2-3-4棵树上进行插入和删除操作 导致节点扩展、拆分和合并的 红黑树中的颜色翻转和旋转。介绍 红黑树通常首先引入2-3-4棵树,因为它们是 概念上更简单<然而,强壮的>2-3-4棵树可能很难生长 在大多数编程语言中实现,因为 树上作业涉及的特殊情况。红黑相间的树很漂亮 更易于实现,因此倾向于使用。

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

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

关于“大量特殊情况”的部分对我来说似乎相当落后(我认为是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
data Color=R | B
数据树a=E | T颜色(树a)a(树a)
平衡::颜色->树a->树a->树a->树a
余额B(tr(tra x B)yc)zd=tr(tba x B)y(tbczd)
余额B(trax(trbbyc))zd=tr(tbaaxb)y(tbczd)
余额B a x(tr(tr B y c)z d)=tr(tb a x B)y(tb c z d)
余额B a x(tr B y(tr c z d))=tr(tb a x B)y(tb c z d)
平衡柱a x b=T柱a x b
插入::Ord a=>a->树a->树a
插入x s=T B a y B,其中
INSE=TREEXE
ins s@(T列a和b)
|xy=平衡柱a y(ins b)
|否则=s
T a y b=ins s

这个著名的定义

我不确定哪一个更容易实现,但可能会有所帮助。这似乎很主观,所以也许你可以编辑这个问题,以更具体地说明什么是“更容易”。也许只是需要考虑的特殊情况的数量?我明白你的意思,但维基百科和我提到的教科书都使用了相同的概括性。。。i、 e.比较两种不同算法的实现时,只考虑“易用性”或“简单性”。我想用SLOC来衡量这样一个模糊不清的词是一个好主意。另一个是“易于理解”,这确实是主观的。。。但我认为,在很大程度上,这一指标是正确的:SLOC越少,就越容易理解。