散列表算法和冲突处理

160 阅读1分钟

散列表又称哈希表,散列表是一种数据逻辑结构,通过特定的算法来确定一串散列地址,当需要存放元素的时候,则会存在对应的地址。

1、除留余数法:H(key) = key % p

散列表表长为m,取一个不大于m但最接近或等于m的质数p

2、直接定址法:H(key) = k 或 H(key) = a*key + b

ab都是常数,适用于连续内容存储

3、数字分析法:选取数码分布较为均匀的若干位作为散列地址

例如电话号码

4、平方取中法:取关键字的平方值得中间几位作为散列地址

通过上面的算法函数,就能够确定每一个元素存放的位置,但是会存在另外一种情况,例如:当使用 H(key) = key % 2 时,13 和 15 最终会存在哈希值为1的地址中,这就存在了冲突,需要用特殊的手段进行处理。

1、拉链法

这种方法在java中的hashmap中用的非常多

2、开放定地法(三种方法都是由di不同决定)(H(key) + di) % m,H(key) = key % p

线性探测法 
    di = 1,2,3,4,5,...,n,存入的时候如果冲突,则用下一个
平方探测法
    当di = 0^2,1^2,-1^2,2^2,-2^2,...,k^2,-k^2时,存入的时候如果冲突,则用下一个
伪随机序列法
    自定义di = a,b,c,d,...m,n,存入的时候如果冲突,则用下一个