哈希表:用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。
数组的下标是整数,但是通常生存中存储的key都不规则,所以通过散列函数将键值key转成数组下标,存入数组
散列函数:就是把键值key 转化为数组下标的函数,例如
(关键字)%(数组大小),就是数组下标
数组大小一般为质数,因为需要均匀的放在hash表中,质数只能被自生和自生倍数整除
散列冲突:模运算后取模值相同,2个不同的key通过散列函数计算出的数组下标一致,就成了散列冲突
解决散列冲突,哈希冲突
1.链表解决
相同的取模,用指针指向下一个地址,java中hashmap就是用链表解决散列冲突的
2.开放地址 – 线性探测法
冲突就放在当前地址下一个位置
3.开放地址:平法探测法
新位置:= 当前地址的平方
4.开放寻址:双哈希探测法
所谓双重散列,意思就是不仅要使用一个散列函数。我们使用一组散列函数 hash1(key),hash2(key),hash3(key)……我们先用第一个散列函数,如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置
表满: 再次hash rehashing
表超过存储量70%,就会设计一个2倍原来表大小的hash表,把旧表的数据模运算放到新表中,一边插入一边搬移
缺点:
表越满,性能越差,因为表越满,发生冲突可能性越高,计算越多