Answers:
红黑树的插入速度更快,但AVL树的查找边缘略微。AVL树可能更容易实现,但根据我自己的经验,可能还不够。
AVL树确保每次插入或删除后树均平衡(没有子树的平衡因子大于1 / -1,而红黑树则确保树在任何时候均保持合理平衡)。
如果您可以使用随机数据结构,我会考虑使用其他方法:跳过列表。
从高级的角度来看,它是树结构,除了它不是实现为树,而是实现为具有多层链接的列表之外。
您将获得O(log N)插入/搜索/删除,并且无需处理所有棘手的重新平衡情况。
我从来没有考虑过用功能语言来实现它们,并且Wikipedia页面没有显示任何内容,因此它可能并不容易(变得不可变性)。
如果您想从一个相对简单的结构开始(AVL树和红黑树都比较笨拙),则一个选项是treap-命名为“ tree”和“ heap”的组合。
每个节点都获得一个“优先级”值,该值通常在创建节点时随机分配。节点位于树中,以便遵守键顺序,并遵守类似堆的优先级顺序。类堆排序意味着父级的两个子级都比父级低。
EDIT 删除了上面“键值内”的内容-优先级和键顺序同时使用,因此即使对于唯一键,优先级也很重要。
这是一个有趣的组合。如果密钥是唯一的,并且优先级是唯一的,则任何节点集都有唯一的树结构。即使这样,插入和删除还是有效的。严格来说,树可以不平衡到有效地成为链表的程度,但这极不可能(与标准二叉树一样),包括在正常情况下,例如按顺序插入键(与标准二叉树不同)。
哪个最有效?
含糊且难以回答。所有的计算复杂度都是明确定义的。如果这就是效率的意思,那么就没有真正的争论。确实,所有好的算法都带有证明和复杂性因素。
如果您指的是“运行时”或“内存使用”,则需要比较实际的实现。然后,语言,运行时间,操作系统和其他因素开始起作用,使问题难以回答。
哪个最容易实现?
含糊且难以回答。有些算法对您来说似乎很复杂,但对我来说却微不足道。
最常使用哪个?
含糊且难以回答。首先是“由谁来”?这部分吗?只有Haskell?C或C ++呢?其次,存在专有软件问题,我们无权访问源进行调查。
但是至关重要的是,您推荐哪个?
我认为这属于此处,因为它尚有争议。
正确。由于您的其他条件不是很有帮助,因此您将获得所有这些。
您可以获取大量树算法的源代码。如果您想学习一些东西,则可以简单地实现所能找到的每一个。而不是要求“推荐”,只需收集您可以找到的每种算法。
这是清单:
http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
有六个流行的定义。从这些开始。
如果您对Splay树感兴趣,则可以找到一个更简单的版本,我认为这些版本是Allen和Munroe在论文中首次描述的。它没有相同的性能保证,但是避免了在处理“ zig-zig”与“ zig-zag”重新平衡时的复杂性。
基本上,在搜索(包括搜索要删除的插入点或节点)时,找到的节点将直接朝根的方向旋转,自下而上(例如,递归搜索功能退出)。在每个步骤中,您都选择一个向左或向右旋转,具体取决于您要向根部向上拉出另一步的孩子是右孩子还是左孩子(如果我正确记得我的旋转方向,那就分别是)。
像Splay树一样,其想法是最近访问的项始终位于树的根附近,因此可以快速再次访问。更简单的是,这些Allen-Munroe旋转到根树(我称它们为树-不知道正式名称)可以更快,但它们没有相同的摊销性能保证。
一件事-由于此数据结构从定义上讲即使是针对查找操作也会发生突变,因此可能需要一元实现。IOW,它可能不适合函数式编程。