0
点赞
收藏
分享

微信扫一扫

数据结构-完全hash,二级哈希java实现

千行 2022-07-28 阅读 100


 

package com.data.struct;

import java.util.Random;

/**
*
* @author Administrator
*完全散列,两级散列
*/
public class CompeletHash {
private Object [][]slot;
private int a;//系数a
private int b;//系数b
private int p=101;//最大值范围,假设数据是0到100
private int firstSlot;//一级slot数
public CompeletHash(int slotSize){
firstSlot=slotSize;
slot=new Object[slotSize][];
a=new Random().nextInt(p);
b=new Random().nextInt(p);
for(int i=0;i<slotSize;i++){
Integer mi=p/firstSlot+1;
Object [] secondSlot=new Object[mi+3];
secondSlot[0]=mi;
Integer ai=new Random().nextInt(p);
Integer bi=new Random().nextInt(p);
secondSlot[1]=ai;
secondSlot[2]=bi;
slot[i]=secondSlot;
}
secondSize=new int[firstSlot];
System.out.println("a:"+a+" b:"+b);
}
private int hashFirst(int key){
return (a*key+b)%p%firstSlot;
}
private int hashSecond(int key){
return (((int)(slot[hashFirst(key)][1])*key+((int)slot[hashFirst(key)][2]))%p%((int)slot[hashFirst(key)][0]));
}

private int []secondSize;

public void put(int key,int value){
Entry entry=new Entry();
entry.setKey(key);
entry.setValue(value);
if(slot[hashFirst(key)][hashSecond(key)+3]!=null){
System.out.println("confict:"+key);
}
slot[hashFirst(key)][hashSecond(key)+3]=entry;
secondSize[hashFirst(key)]+=1;
}

public Object get(int key){
Entry entry=((Entry)slot[hashFirst(key)][hashSecond(key)+3]);
if(entry!=null){
return entry.getValue();
}else{
return null;
}

}

public int size(){
int size=0;
for(int i=0;i<firstSlot;i++){
for(int j=3;j<slot[i].length;j++){
if(slot[i][j]!=null){
size+=1;
}

}
}
return size;
}

public void print(){
for(int i=0;i<firstSlot;i++){
for(int j=3;j<slot[i].length;j++){
if(slot[i][j]!=null){
System.out.print("("+((Entry)slot[i][j]).getKey()+","+((Entry)slot[i][j]).getValue()+") ");
}

}
System.out.println();
}
System.out.println();
for(int i=0;i<firstSlot;i++){
System.out.print(secondSize[i]+" ");
}
System.out.println();
}

public void remove(int key){
slot[hashFirst(key)][hashSecond(key)+3]=null;
}

private static class Entry{
private int key;
private int value;
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}


}
public static void main(String[] args) {
CompeletHash myHash=new CompeletHash(10);
myHash.put(33, 33);
myHash.print();
myHash.put(44, 44);
myHash.put(36, 36);
myHash.print();
System.out.println(myHash.size());
for(int i=1;i<100;i++){
myHash.put(i, i);
}
myHash.print();
System.out.println(myHash.size());
}

}

第二级hash会出现冲突可能是二级a,b系数选择问题,有能解决的可以和我联系共同探讨

举报

相关推荐

0 条评论