HashMap 可不可以不使用链表,而直接使用红黑树或者二叉搜索树或者 AVL 等其他的数据结构?

简介: HashMap 可不可以不使用链表,而直接使用红黑树或者二叉搜索树或者 AVL 等其他的数据结构?

我认为 HashMap 之所以没有一开始就使用红黑树,可能是因为时间和空间的折中考虑吧。在 Hash()冲突比较小的时候,即使转化为红黑树之后,在时间复杂度上产生的效果也不是特别大。

而且在 put 的时候效率可能会降低,毕竟每次 put 都要进行非常复杂的红黑树这种旋转算法、旋转操作。另外在空间上的话每个节点都要维护更多的一个指针,这就显得有点得不偿失了。

最后就是,HashMap 之所以选择红黑树而不是二叉搜索树,我认为最主要的原因是,二叉树在一些极端情况下,它会变成一个倾斜的结构,查找效率就会退化成跟链表差不多的效率。而红黑树它是一种平衡树,可以防止这种极端情况,保持平衡,防止退化成链表。然后红黑树又不像其他的平衡二叉树那样有严格的平衡条件,所以红黑树插入效率要比完全的平衡二叉树要高。

所以 HashMap 选择红黑树,既可以避免极端情况下的退化,又可以兼顾查询和插入的这种效率。

相关文章
|
2月前
|
存储 编译器 C语言
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
10 0
|
2月前
|
存储 缓存 算法
数据结构-链表(一)
链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个节点包含两部分:数据(存储实际的元素值)和指针(指向下一个节点的引用)。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常指向空值(null)。
31 1
|
2月前
|
存储 C++
数据结构第六弹---带头双向循环链表
数据结构第六弹---带头双向循环链表
|
算法 C++
【数据结构与算法】—— 手撕红黑树
【数据结构与算法】—— 手撕红黑树
|
4天前
|
算法
数据结构与算法-AVL树入门
数据结构与算法-AVL树入门
8 0
|
6天前
|
存储 C语言
数据结构基础:双链表结构、实现
数据结构基础:双链表结构、实现
|
6天前
|
存储
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
|
16天前
数据结构—链表(超详细)(山东大学)(数据结构实验三)
数据结构—链表(超详细)(山东大学)(数据结构实验三)
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
|
19天前
数据结构--链表刷题(一)快慢指针(上)
数据结构--链表刷题(一)快慢指针
16 0