存储位置=f(关键字)
那样我们可以通过查找关键字不需要比较 就可获得需要记录的存储位置。这就是一种新的存储技术--散列技术。
散列技术是再记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。我们把这种对应关系f称为称为散列函数,又称为哈希函数。采用散列技术将记录,存储在一块连续的存储空间称为散列表或哈希表。
哈希表的长度一定要为质数,因为要让其分布均匀。
哈希表的缺点,表越满,性能越差,越容易发生冲突,增加计算次数。
如果哈希表满了,就再次哈希,新表尺寸为旧表的两倍以上,为质数。
散列表的构造方法
1.计算简单
2.散列地址分布均匀
直接定址法
取关键字的某个线性函数值为散列地址
f(key)=a*key+b;(a,b为常数)
数字分析法
抽取:使用关键字的一部分来计算散列存储位置的方法。
数字分析法通常适合处理关键字位数比较多的情况。
平方取中法
先平方,再取中间几位
折叠法
除留余数法f
f(key)=keymodp(p<=m)m为表长
方法关键在于选择合适的p
随机数法
选择一个随机数,取关键字的随机函数作为它的散列地址。也就是f(key)=random(key)。
哈希冲突
线性探测法
顺位向下放
平方探测法
往(原始位置+i*i)的位置寻找空位(i代表查找次数)
双哈希
设置第二个哈希函数(为了冲突准备的),hash2(key)=R-(keymodR),R为比数组尺寸小的质数。
新位置=原始位置+i*hash2;