散列的平方探测法实现

public class QuadraticProbingHashTable<T> {
    private static final int DEFAULT_TABLE_SIZE=10;
    private HashEntry<T>[] array;
    private int currentsize;
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 contain(T val){
    int address=findPos(val);
    return isActive(address);
}
public void remove(T val){
    int address=findPos(val);
    if(isActive(address)){
        array[address].active=false;
    }
    currentsize--;
}
public void insert(T val){
    int address=findPos(val);
    if((isActive(address)))
        return;
    array[address]=new HashEntry<T>(val, true);
    if(++currentsize>array.length/2){
        rehash();
    }
}
private static class HashEntry<T>{
    public T val;
    public boolean active;
    public HashEntry(T val){
        this(val,true);
    }
public HashEntry(T val,boolean active){
        this.val=val;
        this.active=active;
    }
}

private void allocateArray(int arraySize){
    array=new HashEntry[nextPrime(arraySize)];
}
private boolean isActive(int currentPos){
    return array[currentPos]!=null&&array[currentPos].active;
}
private int findPos(T val){
    int num=1;
    int currentnum=myhash(val);
    while(array[currentnum]!=null&&!array[currentnum].val.equals(val)){
        currentnum+=num;
        num+=2;
        if(currentnum>array.length){
            currentnum-=array.length;
        }
    }
    return currentnum;
}
private void rehash(){
    
}
private int myhash(T val){
    int t=val.hashCode()%array.length;
    if(t<0){
        t+=array.length;
    }
    return t;
    
}
private static int nextPrime(int n){
    if(isPrime(n)){
        return n;
    }
    boolean b=false;
    while(!b){
        n+=1;
        b=isPrime(n);
    }
    return n;
}
private static boolean isPrime(int n){
    if(n==1&&n==3){
        return true;
    }
    if(n==2&&n==4){
        return false;
    }
    for(int i=5;i<= Math.sqrt( n ); i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}
}

 

转载于:https://www.cnblogs.com/wxw7blog/p/7608449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值