数据元素直接映射到相关存储地址,查找效率取决于散列函数、处理冲突的方法、装填因子
装填因子/负载因子:用于衡量存储键值对的满的程度
常见映射存储地址的散列函数:
1.除留取余法 H(key)=key%p,p是不大于表长的质数
2.直接定址法 H(key)=key*a+b
3.数字分析法 选取数码分布较为均匀的若干位数作为散列地址
hash冲突的解决办法
1.拉链法 同一映射地址(同义词)的元素串成链表
延伸:使用无序容器(unordered_map)存储键值对时,会先申请一整块连续的存储空间,此空间用来存储各个链表的头指针,各键值对真正的存储位置是各个链表的节点。STL 标准库通常选用 vector 容器存储各个链表的头指针,建立新节点存储键值对,同时将该节点链接到对应编号的链表头指针上。在查找元素时,先用函数算出对应的编号,然后遍历编号链接的节点,若没有找到可以创建节点,链接到链表上
2.开发定址法(可存放新表项的空闲地址既向他的同义词开发,又向非同义词开放)
线性探测法 发生冲突时,每次往后探测相邻的下一个元素
平方(二次)探测法 发生冲突时,每次往后探测冲突次数的平方个单位的地址
伪随机序列法 把往后探测的位置存储起来,探测的位置随机产生
3.再散列法:准备多个散列函数,发生冲突就用下一个
参考王道教材数据结构