算法6-3:解决哈希冲突之线性探针
2014-06-16 19:00
267 查看
线性探针是另外一种解决哈希冲突的办法。这种办法的基本思想就是当遇到哈希冲突时,寻找下一个空位,直到找到空位为止。
示例
先插入一个值S,如下图。
插入其他的一些值,这些值的哈系没有冲突,得到下图的结果。
再插入一个值H,由于H与A的哈系冲突,因此需要寻找一个空的位置。
找到了空位
插入
private static final int M = 100;
private Key[] keys = (Key[])new Object[M];
private Value[] values = (Value[])new Object[M];
public LinearProbeST() {
}
public Value get(Key key) {
int hash = hash(key);
for(int i=0; i < M; i++) {
int index = (hash + i) % M;
Key key2 = keys[index];
// 找不到该键
if(key2 == null) return null;
// 找到了该键
if(key.equals(key2)) {
return values[index];
}
}
return null;
}
public void put(Key key, Value value) {
int hash = hash(key);
for(int i=0; i < M; i++) {
int index = (hash+i) % M;
Key key2 = keys[index];
// 找到了空位
if(key2 == null) {
keys[index] = key;
values[index] = value;
return;
}
// 找到了已经存在的值
if(key.equals(key2)) {
values[index] = value;
return;
}
}
}
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % M;
}
}
性能
随着数据量的增加,由于冲突的哈希值增加因此速度会越来越慢。在冲突很少的情况下,每个操作的复杂度近似为1。在冲突非常多的情况下,每个操作的复杂度可达到N。所以一般取M=N/2,这样性能最佳,又不浪费空间。
Knuth停车问题
有一个固定大小的停车场,每辆车都会在随机的位置i停下,如果停车位i已经被占用了,那么寻找停车位i+1、i+2等。
线性探针算法其实就是Knuth停车问题。http://arxiv.org/abs/math/0502220
示例
先插入一个值S,如下图。插入其他的一些值,这些值的哈系没有冲突,得到下图的结果。
再插入一个值H,由于H与A的哈系冲突,因此需要寻找一个空的位置。
找到了空位
插入
代码
public class LinearProbeST<Key, Value> {private static final int M = 100;
private Key[] keys = (Key[])new Object[M];
private Value[] values = (Value[])new Object[M];
public LinearProbeST() {
}
public Value get(Key key) {
int hash = hash(key);
for(int i=0; i < M; i++) {
int index = (hash + i) % M;
Key key2 = keys[index];
// 找不到该键
if(key2 == null) return null;
// 找到了该键
if(key.equals(key2)) {
return values[index];
}
}
return null;
}
public void put(Key key, Value value) {
int hash = hash(key);
for(int i=0; i < M; i++) {
int index = (hash+i) % M;
Key key2 = keys[index];
// 找到了空位
if(key2 == null) {
keys[index] = key;
values[index] = value;
return;
}
// 找到了已经存在的值
if(key.equals(key2)) {
values[index] = value;
return;
}
}
}
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % M;
}
}
性能
随着数据量的增加,由于冲突的哈希值增加因此速度会越来越慢。在冲突很少的情况下,每个操作的复杂度近似为1。在冲突非常多的情况下,每个操作的复杂度可达到N。所以一般取M=N/2,这样性能最佳,又不浪费空间。Knuth停车问题
有一个固定大小的停车场,每辆车都会在随机的位置i停下,如果停车位i已经被占用了,那么寻找停车位i+1、i+2等。线性探针算法其实就是Knuth停车问题。http://arxiv.org/abs/math/0502220
相关文章推荐
- 算法6-3:解决哈希冲突之线性探针
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 第十五周项目2 利用线性探测解决哈希冲突
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 哈希冲突解决方法
- 数据结构与算法之哈希冲突解决-链地址法与开放定址法对比
- 哈希存储和冲突解决办法
- 第5天:散列HASH(二)冲突解决办法之线性再散列法
- 哈希表的设计与冲突解决
- hash线性探测开放定址法解决冲突
- 哈希解决冲突
- 算法学习 - Hash Table操作,分离链接法解决哈希冲突
- 解决哈希(HASH)冲突的主要方法
- 线性探测再散列解决冲突的哈希表
- 哈希表冲突的两个解决方法线性探测和分离链接法
- 算法学习 - HashTable开放地址法解决哈希冲突
- 解决哈希(HASH)冲突的主要方法
- 自己写的哈希表以及解决哈希冲突
- 解决哈希(HASH)冲突的主要方法
- 解决哈希冲突的几种方法