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版数据结构与算法—哈希表(再哈希法)
最新推荐文章于 2024-05-06 08:30:13 发布