前面介绍的查找是建立在比较的基础上,查找效率由比较次数决定,不仅与被查数据整体的存储结构有关,还与逻辑上可被查找的数据集合所含的数据个数有关,同时与待查记录在查找表中位置以及查找策略如查找方向有关。
理想的查找是不经过任何比较就能根据所查关键吗直接得到待查记录所在的存储位置。散列查找技术就是朝该方向努力,它在关键码和存储位置之间建立一种对应关系,散列函数,由该函数可计算出关键码唯一的地址。在存储元素时通过计算通过计算关键码的散列函数值确定存储地址。查找时,计算给定关键字的散列函数值得到存储地址,直接查找。
关键码和存储位置之间的对应函数是散列函数,也称为哈希函数,hash函数。
一、散列函数的构造方法
1、直接定址法
关键码本身和地址之间存在某个线性函数关系时,散列函数取为关键码的线性函数,即:H(key)=a*key+b,a、b均为常数。
这样的散列函数优点就是简单、均匀,也不会产生冲突,但问题是这需要事先知道关键字的分布情况,适合査找表较小且连续的情况。由于这样的限制,在现实应用中,直接定址法虽然简单,但却并不常用。
2、数字分析法
假设关键码完全已知,且每个关键码都是以某个数r为基数(例以10为基数的十进制数)的值,则关键码中若干位恰能构成分布比较均匀的散列地址空间时,可取关键码的若干位的组合作为散列地址。
3、除留余数法
通过选择适当的正整数p,按计算公式H(K)=Kmodp来计算关键码K的散列地址。
若关键码个数为n,散列表表长为m(一般m>=n),通常选p为小于或等于表长m的最大素数或不包含小于20的质因子的合数,一般也要求p>=n。
这种方法计算最简单,也不需根据全部关键码的分布情况研究如何从中析取数据,最常用。
4、平方取中法