码迷,mamicode.com
首页 > 其他好文 > 详细

算法6-3:解决哈希冲突之线性探针

时间:2014-06-18 11:31:28      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:算法   哈希函数   关联数组   

线性探针是另外一种解决哈希冲突的办法。这种办法的基本思想就是当遇到哈希冲突时,寻找下一个空位,直到找到空位为止。


示例


先插入一个值S,如下图。

bubuko.com,布布扣


插入其他的一些值,这些值的哈系没有冲突,得到下图的结果。

bubuko.com,布布扣

再插入一个值H,由于H与A的哈系冲突,因此需要寻找一个空的位置。

bubuko.com,布布扣


找到了空位

bubuko.com,布布扣

插入

bubuko.com,布布扣



代码

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:解决哈希冲突之线性探针,布布扣,bubuko.com

算法6-3:解决哈希冲突之线性探针

标签:算法   哈希函数   关联数组   

原文地址:http://blog.csdn.net/caipeichao2/article/details/31413993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!