微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实现单独链式Hash Map时,更喜欢插入链表的头部还是尾部?

如何解决实现单独链式Hash Map时,更喜欢插入链表的头部还是尾部?

附注: 因为 SO 中的许多人不喜欢讨论 JDK 实现细节的动机/权衡,他们认为 JDK 工程师有权在不告诉任何人的情况下这样做。 (之前关于 JDK 动机的帖子已关闭),这个问题纯粹是关于 HashMap 算法和数据结构以及两个单独的链接实现之间的权衡分析/工程师考虑。

众所周知,我们在实现Hash Map时可以使用seperate chaining method来处理hash collision(每条链都是一个单独的链表)。插入有哈希冲突的新元素时,原则上我们可以选择插入链表的头部或尾部。

两种方法都可以使用相同的最坏时间复杂度。然而,当我学习算法课程时,我的老师告诉我们,我们更喜欢插入到头部,因为一般来说,最近插入的元素有更多的机会被查找。因此,我看到所有带有伪代码或任何编程语言的具体实现的算法或数据结构教科书都选择插入到 head 中。 (例如 Alogirhtms Sedgewick、Clrs(第 258 页)等)

不过前几天看到JDK8的源码HashMapJDK8 选择插入到tail 根据我的知识(JDK 8 source code 中的line 611,641,and putVal() 方法)出乎我的意料。然后我也查了一下JDK7,发现JDK7选择insert into head,跟我们平时学的一样。 (JDK 7 source code 中的 line 402,line 766addEntry() 方法

我的问题:

一般来说,在实现单独的链式HashMap时,插入头部和插入尾部之间的权衡是什么?是否有任何实际的工程师考虑(例如多线程)? (我看过几次 blogs 的讨论,关于如果没有正确同步,插入 head 可能会导致死循环。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。