为什么要使用红黑树以及什么时候使用红黑树?

向 HashMap 中添加数据时不可避免的会产生 Hash 冲突,而 HashMap 使用拉链法来解决 Hash 冲突,这就导致在 Hash 冲突较多的时候,会严重影响 HashMap 的查询效率(链表查询时间复杂度为O(n)),因此引入了红黑树(查询时间复杂度O(log n))这一数据结构来优化。

那么什么时候会使用红黑树呢?

在链表长度达到 8 并且 HashMap 存储的数据量大于 64 时,会将链表转化为红黑树。

为什么不一开始就直接用红黑树呢?

红黑树是二叉平衡树的一种,在插入和删除数据时红黑树需要通过旋转来保持“平衡”,这一过程是要付出代价的。而且红黑树节点的大小为链表节点的 2 倍,在节点太少时红黑树查找性能优势并不明显。

为什么不适用其他数据结构?

如上所述,引入红黑树的目的是为了优化查询效率,但是能够优化查询效率的数据结构又不止红黑树一种,为什么不适用其他的数据结构呢?

例如二叉树、平衡二叉树、B树、B+树这些数据结构查询效率也很高,为什么不适用他们呢?

二叉树

二叉树存在数据倾斜问题,极端情况下会退化成链表(只有左节点或只有右节点),不够稳定。

平衡二叉树

平衡二叉树和红黑树查询时间复杂度都是O(log n)。但是平衡二叉树有更加严格的”平衡“标准,在插入或者删除数据时,平衡二叉树需要更多的旋转才能达到平衡。

B树、B+树

B树和B+树的节点都能存储多个数据,在数据量不是很多的情况下,数据会”挤在“一个节点里面。这个时候遍历效率就退化成了链表。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒... 本站使用 Volantis 作为主题 鲁ICP备-20012065号