java版資料結構與演算法—線性探測雜湊表
阿新 • • 發佈:2018-11-29
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("沒找到");
}
}
}