java版数据结构与算法—线性探测哈希表

package com.zoujc.hash;

/**
 *哈希表:  优点:速度快(插入和查找)
 *          缺点:基于数组,不能有序遍历
 * 键值对:通过键访问值
 * 冲突:不同的关键字经过哈希化得到的数组下标出现了重复
 * 解决冲突:1.开放地址法(线性探测    二次探测    再哈希法)
 *           2.链地址法
 */
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 hashFunc(int key){
        return key%arraySize;
    }
    public void insert(DataItem item){
        int key = item.getKey();
        int hashVal = hashFunc(key);//把得到的值哈希化
        while (hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1){    //位置被占用向下找
            hashVal ++;
            hashVal = hashVal%arraySize;    //是否是最后一个位置,是的话往下走
        }
        hashArray[hashVal] = item;
    }

    public DataItem delete(int key) {
        int hashVal = hashFunc(key);
        while (hashArray[hashVal] != null){
            if(hashArray[hashVal].getKey() == key){ //找到要删除的数据
                DataItem temp = hashArray[hashVal];
                hashArray[hashVal] = nonItem;
                return temp;
            }
            hashVal ++;
            hashVal = hashVal%arraySize;//超出数组最大范围
        }
        return null;//没有找到
    }

    public DataItem find(int key) {
        int hashVal = hashFunc(key);
        while(hashArray[hashVal] != null){
            if(hashArray[hashVal].getKey() == key){
                return hashArray[hashVal];
            }
            hashVal ++;
            hashVal = hashVal%arraySize;
        }
        return null;
    }
}
class HashApp{
    public static void main(String[] args){
        HashTable hashTable = new HashTable(15);
        DataItem dataItem = new DataItem(120);
        hashTable.insert(dataItem);
        DataItem dataItem1 = new DataItem(30);
        hashTable.insert(dataItem1);
        DataItem dataItem2 = new DataItem(11);
        hashTable.insert(dataItem2);
        DataItem dataItem3 = new DataItem(15);
        hashTable.insert(dataItem3);
        hashTable.displayTable();
        hashTable.delete(15);
        hashTable.displayTable();
        hashTable.find(11);
        if(hashTable != null){
            System.out.println("找到了");
        }else {
            System.out.println("没找到");
        }

    }

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38799368/article/details/84558296