java数据结构 哈希表

来源:互联网 发布:淘宝如何加入亲宝贝 编辑:程序博客网 时间:2024/06/10 05:52

哈希表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;


问题2:key为zhangsanzhangsanzhangsan很长的字符串会导致超出int型的值

通过使用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){}}


0 0
原创粉丝点击