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

首先你要知道什么二次探测,在哈希法都是用来解决哈希冲突的。

然后,二次探测就是在线性探测上做一个修改而成的,线性探测中,遇到冲突就自增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 ();
    }



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