您的位置:首页 > 理论基础 > 数据结构算法

Java数据结构与算法《十六讲》开放地址法

2017-04-15 23:52 344 查看
什么是开发地址法
当冲突发生时候 通过查找数组的一个空位 并将数据填入
而不再用哈希函数得到的数组的下标 这个方法叫做开放地址法


//员工信息类
public class Info{
private String key;
private String name;

public Info(String key, String name){
this.key=key;
this.name=name;
}
public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//哈希表
public class HashTable{
private Info[] arr;
//默认构造器
public HashTable(){
arr= new Info[100];
}
//指定数组初始化大小
public HashTable(in maxSize){
arr = new Info[maxSize];
}
//插入数据
public void insert(Info info){
//获得关键字
String key =info.getKey();
//关键字所给的 哈希数
int hashVal =hashCode(key);
//如果这个所有已经被占用 而且里面是一个未被删除的数据
while(arr[hashVal]!=null &&arr[hashVal].getName()!=null){
//进行得加]
++hashVal;
//循环
hashVal %=arr.length;
}
}
//查找数据
public  Info find(String key){
int hashVal =hashCode(key);
while(arr[hashVal]!=null){
if(arr[hashVal].getKey().equals(key)){
Info temp =arr[hashVal];
temp.setName(null);
return temp;
}
++hashVal;
hashVal %=arr.length;
}
}

public int hashCode(String key){
int hashVal=0;
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96;
hashVal +=letter;
}
return hashVal;

BigInteger hashVal = new BigInteger("0");
BigInteger pow27 = new BigInteger("1");
for(int i = key.length() - 1; i >= 0; i--) {
int letter = key.charAt(i) - 96;
BigInteger letterB = new BigInteger(String.valueOf(letter));
hashVal = hashVal.add(letterB.multiply(pow27));
pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));
}
return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: