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("没找到");
}
}
}
java版数据结构与算法—线性探测哈希表
猜你喜欢
转载自blog.csdn.net/weixin_38799368/article/details/84558296
今日推荐
周排行