上代码:
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