哈希表基本理论基础
哈希表的三种形式:
- 数组(数组就是一个简单的哈希表,对于哈希表中的 key,如果哈希值比较连续且固定,我们可以用数组的下标来等同)
- HashTable
- HashSet
场景
Hash函数
hash函数的要求
1、一致性
- 比如将苹果传进去得到的是1,则以后传进去得到的都是1
2、将不同的字符串映射为不同的数值
- 比如苹果映射为1,香蕉映射为5
Hash函数有什么用?
- 将苹果放到数组索引为1的地方,数组存的值2就是苹果的价格。
Hash函数的好处?
- 比如梨是下标4,当我们找梨的价格的时候就可以直接找索引为4的,查找速度显著提高
Hash Table
- Hash函数 + 数组 = Hash Table
- 数组直接映射到内存
- Hash Table具有额外的逻辑,它使用Hash函数智能的找到存放元素的位置
- 在一些语言中称为:Map,hashMap…
使用场景
电话本
- 通过姓名找到电话号码
DNS解析
- 通过域名来找到我们真正的ip地址
缓存
冲突
- 两个k,k1 != k2,但是传入Hash函数里面得到的结果是一样的。
解决冲突
- 使用一个链表的结构,数组指定索引首先指向peach,然后peach的地址在指向pear——这样就形成了一个链表
注意
- 因为如果找的东西在链表的最后一个,就会很慢——链表要挨个查询慢
- 解决方法:变成以后将链表换成红黑树
选择Hash函数
- Hash Table
- 平均:就是通过Hash函数可以直接找到对应的值。
- 最坏:就是Hash Table所有的元素都放到一个位置了,这个位置还使用的是链表。
如何避免冲突
装载因子:load factor
- 解释:上面的hash table一共有6个位置,其中3个位置被占用了。
- 0.5也就是50%
选择好的Hash函数
哈希表底层原理