散列函数
直接地址法:H(Key) = a*Key+b
除留余数法:H(Key) = Key%p,(p是个不大于m的最大素数)
数字分析法:取出现概率均匀的若干位作为散列地址
平方取中法:Key平方,取中间几位作为散列地址
......
解决冲突:
开放地址法:Hi = (H(Key)+di)%m
线性探测:di = 0, 1, 2, ..., m-1,(能遍历表,但会造成堆积,降低查找效率)
平方探测:di = 0, 1^2, -1^2, ..., (m/2)^2, -(m/2)^2,(m为4k+3形式的素数,不能遍历表,但可以避免出现“堆积”问题)
再散列法:di = Hi(key)
注:开放地址法中,删除空要和原始空区分开。因为开放地址法的查找是发现空就得出元素不存在的结论。开放地址法就是开放了相同地址元素的位置给其他地址元素,那么在查找中,如果发现一个删除空,其与原始空不区分,就会停止查找,查找不到存在的元素,出现错误。将删除空和原始空区分,在发现删除空也会继续使用开放地址法继续查找。缺点是表满时可能存在很多删除空的位置未利用,需要定期维护散列表,删除删除空。