聊聊红黑树

红黑树是一种自平衡二叉查找树,在数据结构中占有重要地位。java8库中的HashMap中变引入了红黑树:当散列桶中的链表长度大于等于8,就是用红黑树构建该链表。
红黑树的主要目的是实现高效的查找,所以需要从查找算法说起。我们最熟悉的快速查找算法便是二分查找,算法复杂度为O(lgN)。如果我们对于数据的处理仅限于查找操作,那么二分查找就够用了。但是通常我们对于数据的操作不但包括查找,还有插入、删除等一系列需求[1]。通常二分查找的数据结构是基于数组,很难实现高效的插入等操作;而链表是能够实现高效的插入操作。所以结合二分查找算法和链表的特点,二叉树诞生了[2]。二叉树能保证[1]中的操作时间复杂度在对数级别。这是二分查找算法办不到的。实验证明,随机情况下,二叉树查找比二分查找成本高39%;但是在其他操作上的优势证明这个成本是值得的。
二叉树并不一定是平衡的,在最坏的情况下,二叉树可能变成了链表。所以二叉树的性能关键在于树的高度(平衡程度)。红黑树就是一种能够自平衡的二叉树。效果是即使有数千亿的数据量,也只需要几十次查找操作。至于红黑树的如何实现的,在这里不做详解。简单介绍一下红黑树特点:
  • 1.每个节点或是红色,或者黑色
  • 2.根节点是黑色
  • 3.每个叶节点是黑色的
  • 4.如果节点时红色的,则它的两个子节点都是黑色的(不存 在连个连续的红色节点)
  • 5.对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
这些特点导致了红黑树,大小为N的红黑树的书高不会超过2lgN(特点4)。实验证明这个上界还是比较保守的,一般一次查找所需要的比较次数约为(1.00lgN - 0.5)。这和结论红黑树根节点到任意节点的平均路径长为 ~1.00lgN 不谋而合。同时更重要的是红黑树对于[1]中的操作均只需要对数级时间复杂度即可。

[1] 1.查找 2.插入 3.删除 4.最大值和最小值 5.向上/下取整 6.选择
[2]二叉树并不一定是平衡的,但是为了讨论方便,我们假设其平衡。之后会指出由于缺少平衡性的保证所带来的问题。红黑树其实就是为了解决二叉树平衡性问题而诞生的。

参考资料:《算法》第四版, 《算法导论》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值