解决散列冲突,平方探测法



上代码:

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 elementprivate boolean isActive;//false if marked deletedpublic 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-1curPosition+=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));}}结果:

falsetruefalse

,让情谊在笑声中升腾,当朋友遇到了难题的时候,

解决散列冲突,平方探测法

相关文章:

你感兴趣的文章:

标签云: