首先你要知道什麼二次探測,在哈希法都是用來解決哈希衝突的。
然後,二次探測就是在線性探測上做一個修改而成的,線性探測中,遇到衝突就自增1,而二次探測中,就是把這個自增1 , 去掉換成一個固定值或自定義值,比如,遇到衝突就自增5啊,或者自增時自己用算法計算的步長。
比較簡單所以沒有代碼!
在哈希法,就是有兩個哈希方法,第一個哈希化方法,確定初始位置,衝突就執行第二個哈希化方法。
注意:在哈希法第二個哈希化函數的要求
1.第二個哈希化函數不能和第一個一樣
2.不能輸出0
舉個例子:第二個方法可以設計成這樣
第二個哈希函數
計算下標值:指數-(存儲值%指數)(指數:只能被1和其本身整除的數)
然後上代碼:
package map;
/*
* 在哈希法
*
* 第二個哈希化函數的要求
*
1.第二個哈希化函數不能和第一個一樣
2.不能輸出0
第二個哈希函數
指數-存儲值%指數(指數:只能被1和其本身整除的數)
*/
public class doubleHashApp
{
private Item [] arr ;//數組
private int size ;//當前數組中元素的個數
private Item newItem ;
public doubleHashApp ( int maxSize )
{
arr = new Item [ maxSize ] ;
size = 0 ;
}
//判斷是否滿
public boolean isFull ()
{
return size == arr.length ;
}
//哈希化
public int hash ( int value )
{
return value % arr.length ;
}
//二次哈希
public int doubleHash ( int value )
{
int index = 5 - ( value % 5 ) ;
//因爲在哈希不能返回0,所以如果上面計算成0或負的,就直接付個值(值你隨意),千萬別不寫!!!不然會出現莫名其妙的問題
if ( index <= 0 )
{
index = 2 ;
}
return index ;
}
//查找數據
public int find ( int data )
{
int index = hash ( data ) ;//存放第一次哈希化後下標
int step = doubleHash ( data ) ;//存放第二次哈希化後值
while ( arr [index] != null )
{
//如果找到就返回索引下標
if ( arr [index].getData () == data )
{
return index ;
}
index += step ;//沒找到使用二次哈希
index %= arr.length ;//防止index超出數組下標
}
return - 1 ;//沒找到
}
//插入數據
public void insert ( int data )
{
if ( isFull () )
{
System.out.println ( "full" );
return;
}
int index = hash ( data ) ;//存放第一次哈希化後下標
int step = doubleHash ( data ) ;//存放第二次哈希化後值
newItem = new Item ( data ) ;
//找位置
while ( arr [index] != null )
{
index += step ;
index %= arr.length ;
}
//跳出循環代表找到空位了
arr [index] = newItem ;
++size ;
}
//刪除數據
public boolean delete ( int data )
{
//find方法的返回值爲-1代表沒找到
int value = find ( data ) ;
if ( value == - 1 )
{
return false ;
}
else
{
arr [value] = null ;
return true ;
}
}
//哈希無法有序遍歷,這裏的只是用來觀察元素分佈情況
public void display ()
{
for ( int i = 0 ; i < arr.length ; ++ i )
{
if ( arr [i] != null )
System.out.print ( arr [i].getData () + " " );
else
System.out.print ( "null " );
}
System.out.println ();
}
}