哈希表(HashTable)

news2024/11/29 10:31:48

哈希表(HashTable)

  • 1. 相关概念
  • 2. 哈希函数选择(常用)
  • 3. 哈希冲突(常用)
    • 开散列法/哈希桶法/链地址法:
  • 4. Set接口及实现类
    • 4.0 常用方法
    • 4.1 HashSet
    • 4.2 LinkedHashSet
    • 4.3 TreeSet
    • 4.4 例题

1. 相关概念

  • 哈希函数:可通过该函数计算关键字的存储位置;
  • 哈希冲突:不同关键字通过哈希函数计算出的存储位置一致;

2. 哈希函数选择(常用)

方法介绍
直接定制法取关键字的某个线性函数计算散列地址:Hash(key)=A*key+B;简单、均匀,但需要事先知道关键字的分布情况,适合查找比较小且连续的情况
除数留余法设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址

3. 哈希冲突(常用)

开散列法/哈希桶法/链地址法:

使用数组+链表的形式实现:

  • 对关键字进行哈希映射,计算每个关键字的哈希地址,哈希地址一致的所有关键字处于同一个“桶”中;
  • “桶”中所有元素以单链表的形式进行连接,链表头结点存储在哈希表中;
  • “桶”中存放的是发生哈希冲突的元素;

如果哈希冲突比较严重,“桶”的大小会非常庞大,影响查找效率,所以可对其进行优化:

  • 使用另一个哈希表实现“桶”或使用搜索树实现“桶”;

4. Set接口及实现类

  • Set接口实现了Collection接口,用于存储无序、无重复的数据;
  • HashSet、LinkedHashSet、TreeSet为Set接口的实现类;
  • LinkedHashSet为HashSet的子类,使得遍历set时可按照元素插入顺序进行读取;
  • HashSet线程不安全,为Set接口的主要实现类,可存储null值的key;
  • TreeSet线程不安全,底层实现为红黑树,也就是平衡搜索树,元素必须为同一类型数据,之间可进行比较,因此TreeSet可进行定制排序;
    在这里插入图片描述

4.0 常用方法

在这里插入图片描述

4.1 HashSet

  • 无序性:指的是存储数据时并不按照底层数组的索引顺序进行存储,而是通过哈希值进行存储;
  • 不可重复性:添加元素时会通过元素对应类型的equals方法和hashCode方法进行比较,查看是否重复,如果equals方法返回true则说明元素重复;
  • 线程不安全,为Set接口的主要实现类,可存储null值的key;
  • 元素插入操作:
    1)首先通过元素x对应类的hashCode方法计算元素x的哈希值hashVal;
    2)借助hashVal通过一定的算法计算元素x在哈希表中的哈希地址hashIndex:
    查看hashIndex处是否已经存有元素:(1)如果没有,则直接将x存储在该位置;(2)如果存有元素,则依次与此哈希桶中的每个元素进行比较,遍历比较过程中,如果某已有元素与x的哈希值一样且equals方法返回true则说明有重复元素,添加失败;反之如果哈希值一样但equals方法返回false或哈希值不一样则继续遍历单链表,直到链尾则说明无重复元素,添加成功;
  • 要求:1)待添加元素所在类必须重写hashCode方法和equals方法;2)重写的hashCode方法和equals方法尽可能保证一致性:相等的对象必须具有相同的散列码;
    在这里插入图片描述
    在这里插入图片描述

4.2 LinkedHashSet

  • 为HashSet的子类,在HashSet的基础上进行加强,将所有添加的元素按照添加顺序以链表形式连接起来,便于频繁遍历操作;
  • 可存储null值的key;
  • 每个元素存储时,同时维护两个引用,一个表示前驱结点,一个表示后继节点;

4.3 TreeSet

  • TreeSet线程不安全,底层实现为红黑树,也就是平衡搜索树,元素必须为同一类型数据,之间可进行比较,因此TreeSet可进行自然排序(java.lang.Comparable接口)或定制排序(java.util.Comparator接口);
    在这里插入图片描述

  • 自然排序下,TreeSet添加元素时,使用元素所在类中的compareTo()方法进行大小比较,如果返回值为0说明两元素内容相同;

  • 定制排序下,TreeSet添加元素时,使用TreeSet对象实例化时传入的比较器Comparator中的compare()方法进行大小比较,如果返回值为0说明两元素内容相同;

4.4 例题

在这里插入图片描述
资料来源:尚硅谷

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

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

相关文章

第八章 Attention

目录8.1 Attention 的结构8.1.1 seq2seq 存在的问题8.1.2 编码器的改进8.1.3 解码器的改进 ①8.1.4 解码器的改进 ②8.1.5 解码器的改进 ③8.2 带 Attention 的 seq2seq 的实现8.2.1 编码器的实现8.2.2 解码器的实现8.2.3 seq2seq 的实现8.3 Attention 的评价8.3.1 日期格式转换…

【数据结构】6.5 红黑树(C++)

【数据结构】——6.5 红黑树 没有学过二叉搜索树&#xff08;也叫二叉排序树或二叉查找树&#xff09;的小伙伴们建议先学习一下&#xff0c;这样阅读会更轻松哦 点我学习二叉搜索树 目录一、红黑树的概念和性质二、红黑树的存储结构和声明三、红黑树的构建过程四、红黑树的实现…

淘宝客户失率高怎么办?什么因素会影响?

电商干货 商家开淘宝店铺的时候&#xff0c;很怕的是老客户流失了。或者说经常购买的人不买了&#xff0c;这是淘宝店铺的客户流失。 那么当我们遇到淘宝的客户流失率很高的时候该怎么办呢&#xff1f;有什么样的因素会造成影响呢? 淘宝客户流失率高怎么办 1、做好质量营销 质…

Trimble RealWorks处理点云数据(七)之点云导入3dmax

效果 背景 有时候我们需要通过点云数据来逆向建模,而建模软件常用的有3dmax,SketchUp等,那如何将点云数据导入3dmax来建模呢,下面我们来了解下 步骤 1、las导入Trimble RealWorks 2、对点云数据预处理 可以参考这篇文章 TrimbleRealWorks点云数据预处理 3、导出rcp格式…

语音芯片在射击游乐设备上的应用

射击打靶体验馆项目&#xff0c;产品设备仿真程度高、趣闻性强、外观逼真&#xff0c;现场体验是一种集体验&#xff0c;体育竞技为一体且室内外均可使用的游乐&#xff01; 在靶上能够看到击中目标的效果&#xff0c;而且会语音报环靶&#xff0c;通过低音炮&#xff0c;可以…

Pytorch基础 - 6. torch.reshape() 和 torch.view()

目录 1. torch.reshape(shape) 和 torch.view(shape)函数用法 2. 当处理的tensor是连续性的(contiguous) 3. 当处理的tensor是非连续性的(contiguous) 4. PyTorch中的contiguous 在本文开始之前&#xff0c;需要了解最基础的Tensor存储方式&#xff0c;具体见 Tensor数据类…

Spring常见面试题汇总

文章目录在Spring中&#xff0c;Bean的作用域有哪几个&#xff1f;SpringMVC的执行流程你知道吗&#xff1f;谈谈你对Spring IOC的理解&#xff1f;DI又是什么&#xff1f;谈谈你对Spring AOP的理解&#xff1f;Spring Bean的生命周期你能说出多少&#xff1f;Spring如何解决循…

sggJava基础第三天

运算符 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等。 算术运算符 赋值运算符 比较运算符&#xff08;关系运算符&#xff09; 逻辑运算符 位运算符&#xff08;这个几乎不使用&#xff0c;我们在讲解的时候了解一下即可&#xff0c;只不过…

敏捷团队如何在 PingCode 这类敏捷开发工具中管理 Scrum 开发管理流程

在本教程中&#xff0c;我们将在 PingCode 中介绍如何使用 Scrum 项目、创建产品待办列表和规划迭代、举行 Scrum 会议等详细流程。准备工作&#xff1a;已创建 PingCode 软件帐户 【免费注册通道】 什么是Scrum&#xff1f;Scrum 是国内外最热门的敏捷开发框架之一。Scrum 通…

【SpringBoot2】SpringBoot基础篇

SpringBoot基础篇 JC-1.快速上手SpringBoot ​ 学习任意一项技术&#xff0c;首先要知道这个技术的作用是什么&#xff0c;不然学完以后&#xff0c;你都不知道什么时候使用这个技术&#xff0c;也就是技术对应的应用场景。SpringBoot技术由Pivotal团队研发制作&#xff0c;功…

第三章 word2vec

目录3.1 基于推理的方法和神经网络3.1.1 基于计数的方法的问题3.1.2 基于推理的方法的概要3.1.3 神经网络中单词的处理方法3.2 简单的 word2vec3.2.1 CBOW模型的推理3.2.2 CBOW模型的学习3.2.3 word2vec的权重和分布式表示3.3 学习数据的准备3.3.1 上下文和目标词3.3.2 转化为o…

loki采集k8s日志

前言 loki 是轻量、易用的日志聚合系统。如果你的k8s集群规模并不大&#xff0c;推荐使用grafanaloki的方案来做微服务日志的采集&#xff1b; Loki组成 loki架构很简单&#xff0c;主要由3部分组成&#xff1a; loki&#xff1a;服务端&#xff0c;负责存储日志和处理查询&…

行程器,数显卡尺液晶驱动IC,VK1623段码LCD驱动芯片资料分享,封装LQFP100,QFP100,RAM映射48EGx8COM

永嘉微电/VINKA 型号&#xff1a;VK1623 封装形式&#xff1a;LQFP100/QFP100/DICE/COG KPP2609 概述 VK1623S是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大384点&#xff08;48EGx8COM&#xff09;的LCD屏。单片机可通过3/4线串行接口配置显示参数和发送显示数据…

Spring Cloud微服务网关Zuul的注解@EnableZuulProxy或@EnableZuulServer做了什么事情

一、Zuul的工作原理 Zuul 1.x的版本是由Servlet以及一系列的Filter组成的&#xff0c;各个组件之间协同合作完成功能&#xff0c;且易于扩展。参看官方的架构图我画了张图&#xff1a; Zuul声明周期&#xff1a; HTTP Request -> DispatcherServlet -> ZuulHandlerMappi…

动力节点老杜Vue3视频笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

代码随想录_二叉树_leetcode654 617

leetcode654 最大二叉树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 …

octave安装使用——吴恩达机器学习

下载octave 解压后双击octave.vbs进行安装 配置 pkg rebuildpkg list 使用基础命令 使用矩阵命令 移动数据 size&#xff1a;矩阵的行和列length&#xff1a;行和列的最大值 读取和存储数据 load&#xff1a;加载文件who&#xff1a;所有变量whos&#xff1a;更详细的变量…

界面开发框架Qt - 组合小部件映射器示例

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Combo Widget Mappe…

人工智能实验二:约束满足问题

一、实验目的 求解约束满足问题&#xff1b;使用回溯搜索算法求解八皇后问题。 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容及步骤 实训内容&#xff1a;2-4 第六章 约束满足问题 1.问题描述 八皇后问题是指在一个 88 的棋盘上摆放八个皇…

Spark运行模式介绍

文章目录1. Local运行模式1.1 基本运行情况介绍1.2 角色划分1.3 Spark 任务提交与解释器对比2. StandAlone运行模式2.1 StandAlone介绍2.2 StandAlone架构2.3 Spark应用架构2.4 StandAlone HA 运行原理3. Spark on YARN3.1 Spark on Yarn 本质3.2 部署模式3.3 两种部署模式运行…