上代码:
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
原文地址:http://blog.csdn.net/u012411414/article/details/44464601