hash算法查找的基本思想:

  1. 假设存在一种hash算法,使得每个对象的hash值都不同
  2. 那么给定一个足够大的数组,将每个对象存储在其hash值所对应的下标位置。
  3. 这样再查找该对象时,只要算出其hash值就可以立刻找到该对象

问题一:不存在使得每个对象hash值都唯一的算法,即如何解决hash冲突?

有两种方法可以解决
1. 开地址法
2. 链接法(java hashmap中用的就是这个,下面也只说这个)

使用如下的数据结构:
推演 hashmap 原理

如果hash冲突,就在该hash所指向的链表中进行插入。
这也是为什么java中要求定义一个对象时,要同时定义其 hash算法 和 equesls算法的原因。


问题二:不可能给定一个足够大的数组,即如何在保证时间开销的情况下同时保证内存开销?

使用两个元素来满足这一点
1. hash表的长度
2. 散列因子

我们不能在计算机中使用一个足够大的数组,所以可以给hash表初始一个长度L。
在添加一个对象时,以 hash%L 的值作为其存储的下标位置
这样一来 hash 冲突的概率必然增加,这时散列因子的作用就来了
可以设定散列因子为 0.75,也就是说将hash表中 75% 的下标位置都已存在相就对象时,就对hash表进行扩容(hashmap 就是这样搞的,扩容的倍数为原来的2倍)
(话说最好hash表的长度都是 2的倍数,这样有利什么来着也不深究了,适可而止吧)

相关文章: