java版数据结构与算法—哈希表(再哈希法)

package com.zoujc.hashDouble;

/** * 哈希表:再哈希法 */
public class DataItem {
    private int iData;
    public DataItem(int data){
        iData = data;
    }
    public int getKey(){
        return iData;
    }
}

class HashTable{
    private DataItem[] hashArray;
    private int arraySize;
    private DataItem nonItem;
    public HashTable(int size){
        arraySize = size;
        hashArray = new DataItem[arraySize];
        nonItem = new DataItem(-1); //删除的值
    }
    public void displayTable(){
        System.out.print("Table:");
        for(int i=0;i<arraySize;i++){
            if(hashArray[i] != null){
                System.out.print(hashArray[i].getKey() + " ");
            }else {
                System.out.print("** ");
            }
        }
        System.out.println();
    }
    //首次哈希函数
    public int hashFunc1(int key){
        return key%arraySize;
    }
    //二次哈希函数,不能输出0,不能与第一次哈希函数相同
    public int hashFunc2(int key){
        //stepSize = constant - (key%arraySize) 这个公式很好,constant是常数,是指数且小于数组容量
        return 5 - key%5;
    }
    //新增
    public void insert(int key,DataItem item){
        int hashVal = hashFunc1(key);   //查找hash到的下标位置
        int stepSize = hashFunc2(key);  //再哈希得到探测步长
        while (hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1){
            hashVal += stepSize;
            hashVal %= arraySize;
        }
        hashArray[hashVal] = item;
    }
    //删除
    public DataItem delete(int key){
        int hashVal = hashFunc1(key);   //查找hash到的下标位置
        int stepSize = hashFunc2(key);  //再哈希得到探测步长
        while (hashArray[hashVal] != null){
            if(hashArray[hashVal].getKey() == key){ //找到要删的数据项
                DataItem temp = hashArray[hashVal];
                hashArray[hashVal] = nonItem;
                return temp;
            }
            hashVal += stepSize;
            hashVal %= arraySize;
        }
        return null;    //没有找到要删的数据项
    }
    //查找
    public DataItem find(int key){
        int hashVal = hashFunc1(key);   //查找hash到的下标位置
        int stepSize = hashFunc2(key);  //再哈希得到探测步长
        while(hashArray[hashVal] != null){
            if(hashArray[hashVal].getKey() == key){
                return hashArray[hashVal];
            }
            hashVal += stepSize;
            hashVal %= arraySize;
        }
        return null;
    }
}
class HashApp{
    public static void main(String[] args){
        HashTable hashTable = new HashTable(15);
        int key = 120;
        DataItem dataItem = new DataItem(key);
        hashTable.insert(key,dataItem);
        int key1 = 30;
        DataItem dataItem1 = new DataItem(key1);
        hashTable.insert(key1,dataItem1);
        int key2 = 11;
        DataItem dataItem2 = new DataItem(key2);
        hashTable.insert(key2,dataItem2);
        int key3 = 15;
        DataItem dataItem3 = new DataItem(key3);
        hashTable.insert(key3,dataItem3);
        hashTable.displayTable();
        hashTable.delete(15);
        hashTable.displayTable();
        hashTable.find(11);
        if(hashTable != null){
            System.out.println("找到了");
        }else {
            System.out.println("没找到");
        }

    }

}

《java版数据结构与算法—哈希表(再哈希法)》

    原文作者:哈希算法
    原文地址: https://blog.csdn.net/weixin_38799368/article/details/84574442
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞