线性探针法哈希表

Posted youzoulalala

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性探针法哈希表相关的知识,希望对你有一定的参考价值。

线性探针法哈希表

2019-07-03  11:40:23

import java.io.ObjectInputStream;
import java.util.ArrayList;

/**
 * @ClassName LinearProbeHashST
 * @Author wangyudi
 * @Date 2019/7/3 10:53
 * @Version 1.0
 * @Description 用线性试探法实现哈希表
 */
public class LinearProbeHashST<Key, Value> 
    private int m; //数组大小
    private int n;//键值对数量
    private Key[] keys;//键数组
    private Value[] values;//值数组
    private ArrayList<Key> arr;//用于迭代的集合

    /**
     * 构造函数
     * 初始化数组对
     */
    public LinearProbeHashST() 
        this(16);
    
    public LinearProbeHashST(int m) 
        this.m = m;
        this.n = 0;
        this.keys = (Key[]) new Object[m];
        this.values = (Value[]) new Object[m];
    

    /**
     * 调整数组的大小(对于线性探针哈希表而言,该数组大小调整时必须的)
     * 需要新建一个哈希表,将源哈希表的数据PUT到新哈希表中,然后把新建符号表的成员给原表
     * @param size
     */
    private void resize(int size) 
        LinearProbeHashST<Key, Value> linearProbeHashST = new LinearProbeHashST<>(size);
        for (int i = 0; i < m; i++) 
            if (keys[i] != null) 
                linearProbeHashST.put(keys[i], values[i]);
            
        
        this.m = size;
        this.values = linearProbeHashST.values;
        this.keys = linearProbeHashST.keys;
    

    /**
     * 获取散列值
     * @param key
     * @return
     */
    private int hash(Key key) 
        return (key.hashCode() & 0x7FFFFFFF) % m;
    

    /**
     * 向哈希表中添加键值对
     *
     * @param key
     * @param value
     */
    public void put(Key key, Value value) 
        if (n > m / 2) resize(m * 2);
        int i = hash(key);
        while (keys[i] != null) 
            if (keys[i].equals(key)) 
                values[i] = value;
                return;
            
            i = (i + 1) % m;
        
        keys[i] = key;
        values[i] = value;
        n++;
    

    /**
     * 根据键获取值
     *
     * @param key
     * @return
     */
    public Value get(Key key) 
        int i = hash(key);
        while (keys[i] != null) 
            if (keys[i].equals(key)) 
                return values[i];
            
            i = (i + 1) % m;
        
        return null;
    

    /**
     * 从哈希表中删除键值对
     *
     * @param key
     * @return
     */
    public Value delete(Key key) 
        int i = hash(key);
        while (keys[i] != null) //在null前遍历所有键值对
            
            if (keys[i].equals(key))  //找到该键
                Value t = values[i];
                keys[i] = null;  //删除找到的键
                values[i] = null;
                i = (i + 1) % m;  //将删除键后面的键值对重新PUT到哈希表中
                while (keys[i] != null) 
                    Key k = keys[i];
                    Value v = values[i];
                    keys[i] = null; //必须置为null,不然在键的索引正好是散列值的情况下会出问题
                    values[i] = null;
                    put(k, v);
                    i = (i + 1) % m;
                
                n--;
                if (n > 0 && n < m / 8) resize(m / 2);
                return t;
            
            
            i = (i + 1) % m;
        
        return null;//未找到该键,则返回null
    

    /**
     * 返回迭代器
     * @return
     */
    public Iterable<Key> keys() 
        arr = new ArrayList<>();
        for (int i = 0; i < m; i++) 
            if (keys[i] != null) 
                arr.add(keys[i]);
            
        
        return arr;
    

 

public static void main(String[] args) 
    LinearProbeHashST<Integer, String> linearProbeHashST = new LinearProbeHashST<>();
    linearProbeHashST.put(12,"12..");
    linearProbeHashST.put(2,"2..");
    linearProbeHashST.put(34,"34..");
    linearProbeHashST.put(17,"17..");
    linearProbeHashST.put(55,"55..");
    linearProbeHashST.put(214,"214..");
    for(Integer i : linearProbeHashST.keys())
        System.out.println(i);
    
    System.out.println("===============================================");
    System.out.println(linearProbeHashST.delete(34));
    for(Integer i : linearProbeHashST.keys())
        System.out.println(i);
    
    System.out.println("===============================================");
    System.out.println(linearProbeHashST.get(55));


//结果
17
2
34
214
55
12
===============================================
34..
17
2
214
55
12
===============================================
55..

 

以上是关于线性探针法哈希表的主要内容,如果未能解决你的问题,请参考以下文章

C++ 哈希表 线性探测 二次探测 哈希桶

数据结构哈希表--线性探测和哈希桶及unordered_set,unordered_map代码示范

数据结构哈希表--线性探测和哈希桶及unordered_set,unordered_map代码示范

C/C++学院0903-Boost/线性表/哈希存储

SDUT 3379 数据结构实验之查找七:线性之哈希表

[DataStructure]非线性数据结构之哈希表二叉树及多叉树 Java 代码实现