Java数据结构-哈希表

news2025/1/17 21:14:16

目录

  • 1. 概念
  • 2. 哈希冲突
    • 2.1 冲突的避免
      • 2.1.1 设计合理的哈希函数
      • 2.1.2 降低负载因子
    • 2.2 冲突的解决-闭散列
    • 2.3 冲突的解决-开散列
  • 3. 哈希桶的实现

1. 概念

哈希表(Hash table,也叫散列表),是根据关键码值(Key)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,能够加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表(所以,哈希表的本质其实是数组)。

例如
在这里插入图片描述

2. 哈希冲突

不同的关键字,通过同一个哈希函数,计算出相同的结果,这就叫哈希冲突
拿上面这个图举例,如果想插入44,44通过哈希函数,44%10得出结果为4,所以44应该存储在哈希地址为4的地方,可是这个地方已经被4霸占,这个现象就叫哈希冲突

2.1 冲突的避免

两种方法:1、设计合理的哈希函数,2、降低负载因子

2.1.1 设计合理的哈希函数

常见的哈希函数有:

  • 直接定值法
  • 除留余数法
  • 平方取中法
  • 折叠法
  • 随机数法
  • 数学分析法
    比较常用的有除留余数法:Hash(Key) = key%Capacity(Capacity指的是数组的长度)

2.1.2 降低负载因子

负载因子=存入表中的元素个数/哈希表的长度
负载因子越大,冲突率越高,也就是说,想要避免冲突,就需要扩容,当负载因子达到0.75(官方给出的)时,我们就要考虑扩容了

2.2 冲突的解决-闭散列

发生冲突了,我们不能坐视不管,需要解决冲突。解决冲突的一种方法是闭散列,也叫开放地址法。

  1. 线性探测

    在这里插入图片描述
    插入14,发现哈希地址为4的位置已有元素,此时就往后找空位,插入到空位即可
    在这里插入图片描述
    缺点:冲突的元素容易聚集在一个地方
  2. 二次探测
    按照公式:H = (H0+i^2)%m
    H0表示第一次冲突时的位置(下标),i表示冲突的次数(第几次冲突),m是数组长度,要到插入的位置H

2.3 冲突的解决-开散列

开散列,也叫开放地址法、链地址法、哈希桶。
在Java中,这里的数组不是简单的数字,而是数组+链表,每个元素存储的是链表头结点的地址,冲突的元素都是头插或者尾插在链表中,链表的长度不会太长,当链表长度过长,这个链表则会变成红黑树!!!
在这里插入图片描述

3. 哈希桶的实现

public class HushBucket {

    public double LoadFactor = 0.75;//默认的负载因子

    static class Node {
        public int key;
        public int val;
        public Node next;

        public Node(int key, int val) {
            this.val = val;
            this.key = key;
        }
    }

    //计算当前负载因子
    private double getLoadFactor() {
        return size * 1.0 / array.length;
    }

    //扩容
    private void resize() {
        //每个元素都需要重新哈希
        Node[] newArr = new Node[array.length * 2];
        for (int i = 0; i < array.length; i++) {
            Node cur = array[i];
            //遍历链表
            while (cur != null) {
                int newIndex = cur.key % newArr.length;
                Node cN = cur.next;
                cur.next = newArr[newIndex];
                newArr[newIndex] = cur;
                cur = cN;
            }
        }
        array = newArr;
    }

    public int size;//元素个数
    public Node[] array;//数组

    public HushBucket() {
        this.array = new Node[10];
    }

    public void put(int key, int val) {
        int index = key % array.length;
        Node cur = array[index];
        while (cur != null) {
            if (cur.key == key) {
                cur.val = val;
                return;//key不能重复,插入重复的key相当于更新val
            }
            cur = cur.next;
        }
        Node newNode = new Node(key, val);
        newNode.next = array[index];
        array[index] = newNode;
        size++;
        if (getLoadFactor() >= LoadFactor) {
            //当前负载因子大于等于默认负载因子,需要扩容
            resize();
        }
    }

    //获取key值的val
    public int get(int key) {
        int index = key % array.length;
        Node cur = array[index];
        while (cur != null) {
            if (cur.key == key) {
                return cur.val;
            }
            cur = cur.next;
        }
        return -1;
    }

}

注意事项:
扩容时,所有元素都需要进行重新哈希,因为容量变了,根据哈希函数计算的结果也会不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反激变压器的设计要点

反激电源的设计最关键的就是在于开关电源的变压器&#xff0c;我们对于反激电源变压器的设计计算的最终目的是为了得到一下几点&#xff1a; 1 原边和副边的电流波形 2 原边和副边的电压波形或幅值 3 磁通密度状况 &#xff08;我们选择的磁芯是不是饱和了&#xff0c;是不是…

Matplotlib | 绘制柱状图

简介 安装 Matplotlib 开始绘制 简单柱状图 改变颜色 改变纹理 改变边框样式 改变透明度 改变柱子宽度 改变图表标题 ​编辑 并列柱状图 横向柱状图 堆叠柱状图 更多函数 简介 柱状图&#xff08;Bar chart&#xff09;&#xff0c;是一种以长方形的长度为变量的…

基于JSP的人才公寓管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;浏览器&#xff08;如360浏览器、谷歌浏览器、QQ浏览器等&#xff09;、MySQL数据库 系统展示 …

实时数据传输:Django 与 MQTT 的完美结合

文章目录 准备工作创建 Django 项目与应用设置 MQTT 服务器编写 Django 视图编写前端模板发布 MQTT 消息运行 Django 项目 在当今互联网应用中&#xff0c;实时数据传输已经成为许多项目的核心需求。无论是社交媒体平台、在线游戏、金融交易还是物联网设备&#xff0c;都需要及…

OneCommander使用与安装手册

OneCommander使用与安装手册 一、引言 OneCommander是一款专为Windows 10和Windows 11用户设计的现代化文件管理器&#xff0c;它提供了直观、高效的文件浏览和管理体验。本手册将指导您完成OneCommander的安装过程&#xff0c;并介绍其主要功能和操作方法。 二、安装前准备…

8个免费下载音乐的网站,建议收藏!

1、My Free MP3 tools.liumingye.cn/music/ 一个好用且免费的在线音乐播放和下载网站&#xff0c;几乎收录了所有国内外大火的歌手和歌曲&#xff0c;可以通过歌手列表找单曲&#xff0c;也可以直接搜索歌手或歌曲名&#xff0c;下面还有一些热门搜索&#xff0c;可以直接播放…

BIO 探究二

接上文 BIO 初探究 文章目录 前言一、使用netty二、nio 客户端 与 bio 服务端&#xff0c;bio 服务端 与 nio 客户端总结# 未完待续 前言 提示&#xff1a;验证阻塞到底阻塞在什么地方 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、使用netty 上…

Docker 部署 Redis Cluster 高性能高可用分片集群

文章目录 1、环境准备2、Cluster 集群讲解2.1、Cluster 介绍2.2、Cluster 和哨兵模式区别2.3、Cluster 如何分散存储数据 3、Cluster 搭建流程3.1、安装 Docker3.2、启动 Redis 容器3.3、创建 Cluster 集群 4、Cluster 集群测试4.1、读写操作4.2、故障转移 1、环境准备 准备6台…

Linux系统中qfile调用seek无法更新指定位置文件内容

一、问题描述 最近在移植qt程序到银河麒麟系统中&#xff0c;发现在Windows下调用seek接口更新二进制文件功能在麒麟系统中总是无法实现更新&#xff0c;调用的QFile接口也并未报错。 原代码实现方式如下&#xff1a; if (!m_writeFile->open(QIODevice::WriteOnly | QIODe…

GLM-4本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

必应bing国内广告怎样开户投放呢?

企业都在寻找高效、精准的营销渠道以扩大品牌影响力&#xff0c;提升市场占有率&#xff0c;作为全球第二大搜索引擎&#xff0c;微软旗下的必应Bing凭借其卓越的搜索技术和庞大的用户基础&#xff0c;成为了众多企业拓展市场的首选广告平台。在中国&#xff0c;必应Bing广告以…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的&#xff0c;包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误&#xff1a;如果模型在导入或创建时材质没有正确加载或设置&…

AIGC实战!7个超热门的 Midjourney 关键词教程

一、剪纸风格 核心词&#xff1a; paper art&#xff08;剪纸艺术&#xff09; 关键技巧&#xff1a; 主体物&#xff1a;可以换成任意主角&#xff0c;Chinese illustration &#xff08;中国风插画&#xff09;&#xff1b;艺术风格&#xff1a;paper art &#xff08;剪纸…

Qt各发布版本介绍与选择

一.Qt各个主要版本介绍 1.Qt4 Qt4的第一个版本是Qt 4.0&#xff0c;发布于2005年6月1日。 Qt 4的最后一个版本是Qt 4.8.7&#xff0c;发布时间是2015年6月10日。 2.Qt5 &#xff08;1&#xff09;Qt5的第一个版本是Qt 5.0&#xff0c;发布于2012年12月19日。 &#xff08;2&…

提高工作效率的神器有哪些?

在这个人工智能技术蓬勃发展的时代&#xff0c;很多AI工具极大地提升我们的工作效率&#xff0c;比如很多人在用的ChatGPT、Kimi&#xff0c;它们几乎无所不能&#xff0c;小编在日常工作也用它们&#xff0c;建议想抓住AI风口&#xff0c;或者是想用这些工具提升自己的朋友去学…

【云原生】Docker Compose 使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 搭建 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版/如果不是最新可替换最新版本 3.2.2 设置权限 3.2.…

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点&#xff1a; 四、拷贝构造4.1、引入4.2、特征&#xff1a;4.3、默认拷贝构造函数 总结 前言 在本节中&a…

随身WiFi十大热门品牌优缺点分析!哪个品牌的随身wifi更值得买?随身wifi推荐测评!

格行随身wifi 【品牌特点】&#xff1a;服务好&#xff0c;性价比高&#xff0c;随身WiFi行业的“海底捞” 【优点】&#xff1a;专注物联网行业15年&#xff0c;产品和服务双驱动&#xff0c;综合实力和客户口碑领先 【缺点】&#xff1a;产品相对聚焦&#xff0c;产品类型…

springboot 实现kafka多源配置

文章目录 背景核心配置自动化配置类注册生产者、消费者核心bean到spring配置spring.factoriesyml配置使用 源码仓库 背景 实际开发中&#xff0c;不同的topic可能来自不同的集群&#xff0c;所以就需要配置不同的kafka数据源&#xff0c;基于springboot自动配置的思想&#xf…

springboot 图形验证码 前后端分离解决方案 easy-captcha

easy-captcha介绍 easy-captcha&#xff0c;提供了Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目&#xff0c;是个很好用的工具库&#xff0c;文档比较完备。 用法 添加maven依赖 <!--图形验证码--><dependency&g…