散列技术定义
散列技术是记录的存储位置和它的关键字之间建立一个确定的对应关系t,使得每个关键字key对应一个存储位置f(key)。当查找时根据这个对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上
散列技术常用方法
直接定值法
根据一定的线性公式对要存储的数据进行映射,比如映射关系:f(k) = a*key + b(a、b为常熟)
数字分析法
对于一组数字,选择不易重复的数字作为散列的地址,比如手机号的后四位
平方取中法
对于一组数字平方后取所得数据的中间几位数字作为散列地址
折叠法
将关键字从左到右分割成为数相等几部分(最后一部分位数可以不够),然后将这几部分叠加求和,并按散列表长取后几位作为散列地址,如图
除留余数法
将要存储的数字除以一个数,求得余数即为散列地址,公式为:f(key) = key mod p (p<=m),需要注意的是这个方法很容易导致散列冲突(散列是一种哈希)
随机数法
f(key) = random(key)
处理散列冲突方法
开放定址法
就是一旦发生冲突,就会寻找下一个空的散列地址,只要散列表足够大,总能找到空的散列地址来存储数据。公式为:
再散列函数法
对于散列表来说我们事先准备多个散列函数
当一个函数的结果地址冲突我们按着顺序使用下一个函数来求地址
链地址法
将所有关键字为同义词的记录存储在一个单链表中,我们称为这种同义词子表。在散列表中值存储所有同义词子表的头指针(头地址)。