哈希表疑惑

哈希表疑惑

到现在还是对哈希表的存在很多疑问,老师你看我下面说的对吗?


  1.   哈希表 也是一个容器,用来存放数据的, 就和 map、set、数组、链表、树 一样。 

  2.  哈希表 是将任何数据 通过 hash函数(hashcode)  变成一种可以尽量唯一表示的通用数据去保存,和序列化一样吗?

​ 

  这小节的疑惑: 这里自己实现的hashTable 底层使用treeMap去保存数据,那为什么性能还会比TreeMap好呢?  按理说 hashTable 的 增删改查 又封装了 TreeMap, 也就是相比直接用treeMap 多做了一些事情,性能不应该比TreeMap还快啊。 

 

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

1

完全正确。


不对。哈希表不是在做序列化。hash 函数的目的,是让每一个元素有一个“标识”,通过这个标识,可以快速确定这个元素在哈希表这个容器的什么位置。


3

为什么哈希表会比 TreeMap 性能好?


因为如果单纯使用 TreeMap,100 万个元素,整个 TreeMap 里存了 100 万个元素,相应的,找到某一个元素的时间,是 log(1000000) = 20(这里忽略了常数)


但是,哈希表首先把空间分成了 M 份(假设是 10000),这样,存储 100 万个元素的话,每一个位置只存储 100 个元素,所以,每一个 TreeMap 只存了 100 个元素,那么在这 100 个元素中,找到某个元素的时间,是 log(100) = 7。而找到这个位置,是 O(1) 级别的。


但是,你说的非常对,这只是理论分析,实际上,哈希表的缺点也很明显。首先,是费空间;其次,有额外开销,比如计算哈希函数的过程等等。所以在实际应用中,不一定哈希表永远比红黑树强。但是,如果数据规模达到一定程度,同时空间允许,哈希表大概率是优于红黑树的。



继续加油!:)

  • bobo老师好,请问老师一个问题。我们的红黑树实现RBTree<K extends Comparable<K>, V>,限制K是可比较的类型。Java类库中TreeMap<K,V>是基于红黑树实现的,虽然没有类型限制,但是在使用时,如果K没有实现Comparable<T>接口且没有传入Comparator比较器,也是会报错的(Java类库实现没有限制K是可比较的类型,个人猜测可能是可以传入比较器的缘故)。


    也就是说老师实现的HashTable<K,V>,在使用时,K也是需要实现Comparable<T>接口的,不然会报错。

    但是,Java类库中的HashMap<K,V>,在使用时,即使K没有实现Comparable<T>接口,也不会报错。


    如果HashMap的实现是数组+链表的链地址法,还可以理解,链表中可以放任意类型的数据。但是老师介绍说过,当数据规模大时,链表会组织成一颗红黑树,这里就产生疑惑了。 问题:这颗红黑树是二分搜索树吗?如果是,为什么不用K不用是可比较的?如果不是,这红黑树是怎样的结构呢



    2022-01-24 11:55:30
  • Java 标准实现中的 HashMap,其中转成的红黑树,就是正常的红黑树。


    如果 HashMap 的 Key 不可比较的话,HashMap 会使用这个 key 的系统 hashcode 值作为红黑树的键,而系统的 hashcode 值一定可比较(其实就是一个 int,表示其内存地址。)但是此时,在查找一个 key 的时候,HashMap 会检索整个 tree 进行查找。(因为对于自定义的类,可能系统哈希值不一样,但是其“值”是一样的。)


    换句话说,对于 Java 自带的 HashMap 来说,如果传入的 Key 不可比较的话,其自带的把链表转成红黑树的过程并不会带来性能的提升(因为检索了整棵树,这和遍历整个链表是一样的。甚至性能稍有拖慢,因为有一个转换的过程。)


    这里是一个很好的 ref 解释这个事情:https://yermilov.github.io/blog/2017/02/24/tiebreaker-regarding-java-hashmap-treenode-and-tiebreakorder/

    2022-01-24 12:26:05
  • 感谢老师,解决了我的疑惑。原来组织成红黑树的时候,以Object.hashcode()的值,作为了比较的依据呀。这是我比较矛盾的一点。另外,如果传入的 Key 不可比较的话,其自带的把链表转成红黑树的过程并不会带来性能的提升(因为检索了整棵树,这和遍历整个链表是一样的。甚至性能稍有拖慢,因为有一个转换的过程,也可以理解了

    2022-01-24 15:18:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师