哈希表HashTable提供了快速插入、查找的操作。基於數組實現
(key,value)形式存儲
如果key是int型,可以直接根據key值作爲數組下標
arr[key];
如果key是字符串,需要編寫hashCode函數返回int值
1、對每個字母計算ASCII碼求和
public int hashCode(String key){
int hashVal=0;
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96; //a=97;
hashVal+=letter;
}
return hashVal;
}
問題:key爲bbb,abc,cba的hashCode都是一樣的
2、冪連乘
27包括空格+26個字母
public int hashCode(String key){
//冪連乘
int hashValue=0;
int pow27=1;
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96;
hashValue+=letter*pow27;
pow27*=27;
}
return hashValue;
}
問題1:key爲zhangsan字符串會導致數組arr[]越界
通過壓縮可選值方法-->求餘
return hashValue%arr.length;
通過使用BigInteger類型解決
public int hashCode(String key){
BigInteger hashValue=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));
hashValue=hashValue.add(letterB.multiply(pow27));
pow27=pow27.multiply(new BigInteger(String.valueOf(27)));
}
//壓縮可選值
return hashValue.mod(new BigInteger(String.valueOf(arr.length))).intValue();
}
壓縮可選值,但會出現衝突。
可以使用開放地址法、鏈地址法
/*
* 員工信息類
*/
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(int maxSize){
arr=new Info[maxSize];
}
/*
* 插入數據:將員工的id號作爲索引
*/
public void insert(Info info){
arr[hashCode(info.getKey())]=info;
}
/*
* 查找數據
*/
public Info find(String key){
return arr[hashCode(key)];
}
/*
* 字母的ASCII碼求和/冪連乘
*/
public int hashCode(String key){
}
}