哈希表-開放地址法(二次探測以及在哈希法)

首先你要知道什麼二次探測,在哈希法都是用來解決哈希衝突的。

然後,二次探測就是在線性探測上做一個修改而成的,線性探測中,遇到衝突就自增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 ();
    }



}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章