数据结构--解决散列冲突,平方探测法

来源:互联网 发布:巴西黑帮知乎 编辑:程序博客网 时间:2024/06/07 11:34

上代码:

package com.itany.quadraticprobing;import java.util.LinkedList;import java.util.List;//使用平方探测的散列表 来解决散列时的冲突问题public class QuadraticProbingHashTable<T>{    private static final int  DEFAULT_TABLE_SIZE=11;    private HashEntry<T>[] array;    private int currentSize;//the number of occupied cells    //这个类用来装数据  还有一些标记 来标记是否active 也就是被删除(不是真被删除)所以需要一个类来进行封装    private static class HashEntry<T>    {        private T element;//the element        private boolean isActive;//false if marked deleted        public HashEntry(T element)        {            this(element,true);        }        public HashEntry(T element,boolean i)        {            this.element=element;            isActive=i;        }    }    public QuadraticProbingHashTable()    {        this(DEFAULT_TABLE_SIZE);    }    public QuadraticProbingHashTable(int size)    {        allocateArray(size);        makeEmpty();    }    public void makeEmpty()    {        currentSize=0;        for(int i=0;i<array.length;i++)        {            array[i]=null;        }    }    //判断是否存在 必须先找到该元素位置  然后再通过位置判断是否懒惰删除了(标记为删除)    public boolean contains(T t)    {        int curPosition=findPos(t);        return isActive(curPosition);    }    public void insert(T t)    {        int curPosition=findPos(t);        if(isActive(curPosition))                return;        array[curPosition]=new HashEntry<T>(t);        if(++currentSize>array.length/2)//探测法要保证空的位置>=一半空间            reHash();    }    public void remove(T t)    {        int curPosition=findPos(t);        if(array[curPosition].isActive)            array[curPosition].isActive=false;//改变属性    }    private void reHash()    {        HashEntry<T>[] oldArray=array;//复制一下一会要用    theLists在重新new一个        array=new HashEntry[nextPrime(2*array.length)];        currentSize=0;        //把原来的元素复制到新的数组中  注意是把集合中的元素复制进去        for(int i=0;i<oldArray.length;i++)        {            if(oldArray[i]!=null && oldArray[i].isActive)                insert(oldArray[i].element);        }            }    private int findPos(T t)    {        int offset=1;        int curPosition=myHash(t);        //如果该位置里面有值 并且是这个hash没出现过的 那么就要继续寻找其他位置  如果出现了重复的 直接返回        while(array[curPosition]!=null && !array[curPosition].element.equals(t))        {            //这是进行平方探测的快速方法 f(i)=f(i-1)+2i-1            curPosition+=offset;            offset+=2;            if(curPosition>array.length)                curPosition-=array.length;        }        return curPosition;    }    private static boolean isPrime(int num)    {        int i=1;        while((num%(i+1))!=0)        {            i++;        }        if(i==num-1)        {            return true;        }        else         {            return false;        }    }    private static int nextPrime(int num)    {        while(!isPrime(num))        {            num++;        }        return num;    }    private int myHash(T t)    {        int hashValue=t.hashCode();        hashValue%=array.length;        return hashValue;    }    //把判断是否被删除合成一个方法 在做contains判断时会用到    private boolean isActive(int curPosition)    {        return array[curPosition]!=null && array[curPosition].isActive;    }    private void allocateArray(int arraySize)    {        array=new HashEntry[arraySize];    }    }

package com.itany.quadraticprobing;public class Test{        public static void main(String[] args)    {        QuadraticProbingHashTable<Integer> sc=new QuadraticProbingHashTable<Integer>();        System.out.println(sc.contains(10));        sc.insert(10);        System.out.println(sc.contains(10));        sc.remove(10);        System.out.println(sc.contains(10));    }    }
结果:

false
true
false


0 0
原创粉丝点击