首页 > 作文

Java 数据结构哈希算法之哈希桶方式解决哈希冲突

更新时间:2023-04-05 00:06:31 阅读: 评论:0

一. 实现形式一(键值对只能为整数)

我们可以先实现一个比较简单的哈希表,使用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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图