您的位置:首页 > 其它

这一篇是基于线性探测的散列表

2016-11-23 21:46 162 查看
//总感觉性能不如拉链法的散列表,java自带的那个实现也是用的拉链法

//测试类如下:

public class Fucktest{
public static void main(String[] args) {
tanceSanLieBiao sanlie=new tanceSanLieBiao();

int num=1;
char i = 'a';
for (; i <'z'+1; i++,num++) {
sanlie.put(String.valueOf(i),num);

}

i='a';
for(int tmp=1;tmp<27;tmp++){

System.out.println(sanlie.get(String.valueOf(i++)));
}

}
}



//实现类如下:
/**
* Created by eminem on 16-11-23.
*/

//基于线性探测法散列表

public class tanceSanLieBiao <String,Integer>{

//散列表(数组)长度
private int M=16;
//键值对数量
private int N;

private String[] keys;
private Integer[] valuse;

public tanceSanLieBiao(){
keys=(String[]) new Object[M];
valuse=(Integer[]) new Object[M];
}

public tanceSanLieBiao(int N){
keys=(String[]) new Object
;
valuse=(Integer[]) new Object
;
M=N;
}

private int hash(String key){
return (key.hashCode()&0x7fffffff)%M;
}

private void resize(int cap){
tanceSanLieBiao<String,Integer> tance=new tanceSanLieBiao<String,Integer>(cap);

for (int i=0;i<M;i++){
if(keys[i]!=null){
tance.put(keys[i],valuse[i]);
}
}
keys=tance.keys;
valuse=tance.valuse;

M=tance.M;
}

public void put(String key,Integer value){

if(N>M/2) resize(M*2);

int i;
for(i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
valuse[i]=value;
return;
}
}
keys[i]=key;
valuse[i]=value;

N++;
}

public Integer get(String key){
for(int i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
return valuse[i];
}
}
return null;

}

}


//没实现删除操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐