雜湊表-開放地址法之線性探測
阿新 • • 發佈:2019-02-07
**雜湊表
優點:速度快(插入和查詢)
缺點:基於陣列,不能有序的遍歷
鍵值對儲存方式,通過鍵來訪問值
hashMap.put( key , value );
解決雜湊衝突有兩種方法:
開放地址法
鏈地址法
線性探測屬於開放地址法
線性探測插入演示:
陣列最初狀態
在這組資料中要插入83
先對要插入資料雜湊化,雜湊化後的資料就是陣列下標,這裡雜湊化後的資料是23
然後發現23已經有資料了,產生衝突,線性探測的解決方案是依次遞增,直到找到空位
**
package map;
/*
* 2017年12月19日17:04:18
*
* 雜湊表
*
* 解決雜湊衝突的方法為開放地址法(線性探測)
*/
public class HashApp
{
public dataItem [] arr ;//雜湊表的底層是由陣列實現的
public int size ;//當前陣列的最大長度
public dataItem newItem ;//新插入的節點
public int currentSize ;//當前陣列有幾個元素
//初始化
public HashApp ( int maxSize )
{
arr = new dataItem [maxSize] ;
size = maxSize ;
currentSize = 0 ;
}
//雜湊化
public int hash ( int value )
{
//返回雜湊化後的索引下標
return value % size ;
}
//新增新資料
public void insert ( int data )
{
//如果滿了,直接返回
if ( isFull () )
{
System.out.println ( "hashmap is full" );
return ;
}
int index = hash ( data ) ;//計算雜湊化後的索引
newItem = new dataItem ( data ) ;
//當前下標中元素不為空,說明有元素了,index遞增
while ( arr [index] != null )
{
index ++ ;
index = hash(index) ;//防止index超過陣列最大索引下標
}
arr [index] = newItem ;//退出迴圈,說明找到空位了,放進去
++ currentSize ;
}
//刪除資料
public void delete ( int data )
{
int index = hash ( data ) ;
while ( arr [index] != null )
{
if ( arr [index].getValue () == data )
{
arr [index] = null ;
return ;
}
index ++ ;
index = hash (index) ;
}
}
//查詢資料
public dataItem find ( int value )
{
int index = hash ( value ) ;
while ( arr [index] != null )
{
if ( arr [index].getValue () == value )
{
return arr [index];
}
index ++ ;
index = hash (index) ;
}
return null ;
}
//判斷陣列是否滿
public boolean isFull ()
{
return currentSize == size ;
}
//雜湊表無法有序的遍歷!
//所以這裡遍歷只是檢視一個數據的分佈情況
public void display ()
{
for ( int i = 0 ; i < arr.length ; ++i )
{
if ( arr [ i] != null)
System.out.print ( arr [i].getValue () +" ");
}
System.out.println ( );
}
}
---------------------------------------------
package map;
public class dataItem
{
private int value ;
public dataItem ( int value )
{
this.value = value ;
}
public int getValue ()
{
return value ;
}
public void setValue ( int value )
{
this.value = value ;
}
}