码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 「数据结构」哈希表2:实现哈希表


    🎇个人主页:Ice_Sugar_7
    🎇所属专栏:Java数据结构
    🎇欢迎点赞收藏加关注哦!

    实现哈希表

    • 🍉扩容
    • 🍉插入
    • 🍉获取value
    • 🍉源码

    🍉扩容

    在讲插入之前需要先了解扩容,因为插入后载荷因子如果超过阈值,那我们就要扩容,即扩容是插入操作的一部分

    扩容后,原先哈希表中的元素的哈希地址会改变。之前会发生哈希冲突的元素可能扩容后就不会了
    比如数组初始长度为10,hash(key) = key % capacity,那么key为1和key为11的元素会冲突。现在扩容后长度为20,key为11的元素就会到下标为11的位置

    扩容的思路为:遍历所有节点,重新计算每个节点的地址,并插入到对应位置

        private void resize() {
            Node[] newArray = new Node[array.length*2];
            for(int i = 0;i < array.length;i++) {
                Node cur = array[i];
                //遍历链表
                while(cur != null) {
                    Node tmp = cur.next;  //先保存 cur 的下一个节点,不然头插后会找不到它
                    int newIndex = i % newArray.length;
                    //采用头插法 插入到新数组的 newIndex下标
                    cur.next = newArray[newIndex];
                    newArray[newIndex] = cur;
                    cur = tmp;
                }
            }
            array = newArray;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🍉插入

    插入之前得先检查key是否已经存在,如果已经有了,则只需更新它的value

        public void put(int key, int value) {
            int hash = key % array.length; //计算地址
            Node cur = array[hash];
            while(cur != null) {  //先找一下key是否已经存在,若已经存在,则更新它的value就可以了
                if(cur.key == key) {
                    cur.value = value;
                    return;
                }
                cur = cur.next;
            }
            //到这里说明没找到key,那么就创建新节点,然后头插
            Node node = new Node(key,value);
            node.next = array[hash];
            array[hash] = node;
            size++;
            if(size*1.0 / array.length > LOAD_FACTOR) {
                resize();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    🍉获取value

    这个操作很简单,直接上代码:

        public int get(int key) {
            int hash = key % array.length;
            Node node = array[hash];
            
            while(node != null) {
                if(node.key == key)
                    return node.value;
                node = node.next;
            }
            
            return -1;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🍉源码

    源码放在gitee仓库了,详情可看下面链接:
    实现哈希表

  • 相关阅读:
    【数据结构与算法】骑士周游算法/马踏棋盘算法的介绍和程序实现
    成为会带团队的技术人 架构设计:治理好系统复杂度才最务实
    flask-cache使用报错Python3 ModuleNotFoundError: No module named ‘werkzeug.contrib‘
    518. 零钱兑换 II -- 完全背包
    Hadoop ClassPath
    【机器学习】特征选择之包裹式特征选择法
    Linux UDP编程流程
    传入标签 sql按标签筛选数据 数据必须符合标签
    Android性能优化方法论
    MyBatis模糊查询
  • 原文地址:https://blog.csdn.net/Ice_Sugar_7/article/details/136113657
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号