我们可以先实现一个比较简单的哈希表,使用java中解决哈希冲突的方法,即哈希桶(开散列)方式实现,其中注意:
可以使用内部类方式定义节点负载因子默认为0.75因为我们使用的是哈希桶方式解决哈希冲突,所以在我们扩容成功之后,原来桶中的数据得重新哈希计算出新的位置,不然就和原来桶中的数据的位置不一样了相关代码如下
public class hashbucket { static class node {//使用内部类方式定义节点 public int key; public int val; public node next; public node(int key, int val) { this.key = key; this.val = val; } } private node[] array; public int udsize; public hashbucket() { this.array = new node[10]; this.udsize = 0; } public void put(int key,int val) {//存放数据 //1、确定下标 int index = key % this.array.length; //2、遍历这个下标的链表 node cur = array[index]; while (cur != null) { //更新val if(cur.key == key) { cur.val = val; return; } cur = cur.next; } //3、cur == null 当前数组下标的链表中没有key node node = new node(key,val); node.next = array[index]; array[index] = node; this.udsize++; //4、判断当前有没有超过负载因子 if(loadfactor() >= 台风莲花0.75) {//负载因子我们认为0.75 //扩容 resize(); } } public int get(int key) {//取出数据 //以什么方式存储的 那就以什么方式取 int index = key % this.array.length; node cur = array[index]; while (cur != nu叶连平ll) { if(cur.key == key) { return cur.val; } cur = cur.next; } return -1; } public double loadfactor() {//计算负载因子 return this.udsize*1.0 / this.array.length; } public void resize() {//扩容函数 //自己创建新的2倍数组 node[] newarray = new node[2*this.array.length]; //遍历原来的哈希桶 //最外层循环 控制数组下标 for (int i = 0; i < this.array.length; i++) { node cur = array[i]; node curnext = null; while (cur != null) { //记录cur.next curnext = cur.next; //在新的数组里面的下标 int index = cur.key % newarray.length; //进行头插法 cur.next = newarray[index]; newarray[index] = cur; cur = curnext; } } this.array = newarray; 形容秋天的词 }
上面我们实现的哈希表中的键值对只能存放整型数据,但若是比较复杂的类型,例如字符串,对象等等,此时就需要用到泛型了。其中注意:
同样可以使用内部类方式定义节点类型使用泛型将泛型转换成整数时要用到hashcode
方法利用对象哈希值确定下标,为了防止哈希值太大,应该让其%数组的长度遍历数组下标时,利用equals方法比较key是否相同存放自定义的数据类型时,一定要重写hashcode
和equals方法相关代码如下
class person { public string id; public person(string id) { this.id = id; } @override public string保险公司排名前十 tostring() { return "person{" + "id='" + id + '\'' + '}'; } @override public boolean equals(object o) { if (this == o) return true; if (o == null || getclass() != o.getclass()) return fal; person person = (person) o; return objects.equals(id, person.id); } @override public int hashcode() { return objects.hash(id); }}public class hashbuck2<k,v> { static class node<k,v> { public k key; public v val; public node<k,v> next; public node(k key,v val) { this.key = key; this.val = val; } } public node<k,v>[] array = (node<k, v>[]) new node[10]; public int udsize; public void put(k key,v val) { //通过hashcode方法定位数组的下标 int hash = key.hashcode(); int index = hash % this.array.length; node<k,v> cur = array[index]; while (cur != null) { //equals 起的作用是遍历当前数组下标的key是否相同 if(cur.key.equals(key)) { cur.val = val; } cur = cur.next; } node<k,v> node = new node<>(key,val); node.next = array[index]; array[index] = node; this.udsize++; } public v get(k key) { int hash = key.hashcode(); int index = hash % this.array.length; node<k,v> cur= array[index]; while (cur != null) { if(cur.k艺术类院校排名ey.equals(key)) { return cur.val; } cur = cur.next; } return null; }
到此这篇关于java 数据结构哈希算法之哈希桶方式解决哈希冲突的文章就介绍到这了,更多相关java 哈希冲突内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 00:06:29,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/2d6e2918cd55c497db43db14c61d1671.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java 数据结构哈希算法之哈希桶方式解决哈希冲突.doc
本文 PDF 下载地址:Java 数据结构哈希算法之哈希桶方式解决哈希冲突.pdf
留言与评论(共有 0 条评论) |