散列表(hash table)的实现叫做散列(hashing)。这是以常数平均时间O(1)进行插入、删除和查找的技术。散列表没有顺序,需要元素间排序信息的操作,如findMin、findMax不会得到有效支持(就是这东西不是这么用的,你可以实现,但效率不会很高)。理想情况下,散列表是一个包含关键字的具有固定大小的数组,数组大小一般被视为散列表的一部分。数据通过散列函数简单的计算映射到数组适当的位置上,理想情况下当然是每个关键字对应一个位置,但这是不可能的。关键字那么多,数组大小总是有限的,总会有那么两个关键字被映射到同一个位置。因此我们放宽要求,希望散列函数简单,而且使关键字分布得比较均匀。一般关键字有整数和字符串,对应就有不同的散列函数,这里介绍几种散列函数:
关键字为整数:
1、取余法
用关键字对M取余作为散列地址,散列函数为hash(x)=x mod M,M一般为数组大小。这里的数组大小需要仔细考虑,设想如果M=10,而关键字都以0结尾,他们将会全部散列到0这个位置。一般取M为素数是比较好的选择。当然对于取余法还有很多可以改进的地方,比如对x进行线性运算(a*x+b)再取余来增大每个x的间隔,x乘一个小数对结果的小数部分进行其他操作等,散列函数还是要根据实际需求来选择。
2、平方取中法
先对x求平方,截取结果的中间几位作为散列函数值。这样做的好处在于中间几位数与关键字每一数位都有关,受关键字的影响较大。理解一下:
一个数的平方可以拆成这个数进行多次移位相加的结果,比如56,二进制是111000,111000*111000=111000*(