首页 > 其他分享 >数据结构之<散列表>的介绍

数据结构之<散列表>的介绍

时间:2023-12-28 23:32:37浏览次数:46  
标签:介绍 列表 装载 因子 键值 冲突 哈希 数据结构

简介


散列表也叫做哈希表,是根据键值对 (key,value) 进行存储的一种数据结构。散列表利用哈希函数将给定的键映射到一个特定的位置(通常是数组索引),这个位置通常被称为哈希值或哈希地址。 这里可以举个微信好友列表的例子说明,存放好友首字母的表对应的就是散列表。

1.哈希函数


哈希函数是散列表的关键部分,它接收一个键作为输入并输出对应的哈希值。哈希函数应该尽可能地将键均匀地映射到散列表的位置上,以减少冲突的概率。一个好的哈希函数应该具有以下特性:

  • 唯一性:对于不同的键,应该生成不同的哈希值。
  • 一致性:对于相同的键,始终生成相同的哈希值。
  • 均匀性:尽可能地减少哈希冲突,即不同的键映射到相同的哈希值的情况。

2.碰撞处理


哈希函数并不总能保证完全避免冲突。当两个或多个键映射到相同的哈希值时,就会发生冲突。常见的处理冲突的方法有:

  • 开放寻址法:冲突发生时,尝试寻找散列表中的下一个位置。这包括线性探测二次探测等方法。这样,每个位置只能存储一个键值对。
  • 链地址法:每个散列表的位置维护一个链表,发生冲突时,新的键值对被插入到链表中。这样,每个位置都可以存储多个键值对。

3.装载因子


表示散列表中已经被占用的位置的比例。装载因子的增加会导致冲突的概率上升,影响散列表的性能。装载因子通常用 λ 表示,计算公式如下:

数据结构之<散列表>的介绍_键值对

装载因子的影响

装载因子直接影响散列表的性能和效率。当装载因子较小时,散列表的空间利用率低,但是查找、插入和删除操作的性能可能会较好,因为冲突的可能性较小。而当装载因子较大时,散列表空间被更充分地利用,但是可能导致哈希冲突增多,降低了操作的效率。

装载因子的影响操作

  1. 插入操作:随着装载因子增大,哈希冲突的概率也增加,这会导致插入操作需要进行更多次的冲突解决,从而影响性能。
  2. 查找操作:装载因子增大,可能使得链表长度增加(如果使用链地址法解决冲突),从而增加了查找特定元素所需的比较次数,影响了查找操作的效率。
  3. 删除操作:装载因子较小时,删除操作可能较为简单快速,但在较大的装载因子下,删除操作可能会涉及到链表的重组,导致性能下降。

装载因子的控制

为了维护散列表的性能,需要对装载因子进行控制。通常,当装载因子达到某个阈值(例如 0.7 或 0.8)时,可以考虑进行散列表的重新哈希(即调整散列表的大小,重新分配存储空间并重新插入元素),以减小装载因子,避免性能下降。


4.性能分析


散列表在良好设计的情况下具有常数时间复杂度(O(1))的性能,但是在最坏情况下可能会退化到线性时间复杂度(O(n))。哈希函数的质量和冲突处理的方法都会影响散列表的性能。

5.应用


  • 字典:用于实现键值对的存储和检索。
  • 缓存:存储计算结果或者频繁访问的数据,以加快访问速度。
  • 数据库索引:用于加速数据库查询。
  • 编译器和解释器:用于符号表和标识符的快速查找。

推荐观看:【数据结构】散列表(哈希表)

标签:介绍,列表,装载,因子,键值,冲突,哈希,数据结构
From: https://blog.51cto.com/xaye/9019282

相关文章

  • 数据结构&&集合总结
    总结数据结构数据结构:保存数据的一种方式常见的数据结构通过数组来保存,基于数组的数据结构(动态数组,长度可变的数组)基于数组的结构的优缺点​ 1.通过下标查询元素,效率高​ 2.通过下标修改元素,效率高​ **查改快**​ 在需要扩容的时候:添加慢,删除慢,插入元素慢......
  • 【数据结构】C语言实现单链表的基本操作
    单链表基本操作的实现导言大家好,很高兴又和大家见面啦!!!在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单链表,如......
  • MATLAB工具箱介绍
    Toolbox工具箱序号工具箱备注 数学、统计与优化 1SymbolicMathToolbox符号数学工具箱2PartialDifferentialEuqationToolbox偏微分方程工具箱3StatisticsToolbox统计学工具箱4CurveFittingToolbox曲线拟合工具箱5OptimizationToolbox......
  • 国际物流公司科普_集装箱种类区分和介绍_箱讯科技
    集装箱运输的不断发展,为适应装载不同种类货物的需要,因而出现了不同种类的集装箱。今天和大家一起来总结一下。按使用材料分类根据箱子主体部件(侧壁、端壁、箱顶等)采用什么材料,就叫做什么材料制造的集装箱,按使用材料分类,集装箱可分成三种:(1)铝合金集装箱,优点是重量轻,外表美观,防腐蚀,弹......
  • Kubernetes 网络之 Ingress 介绍
    一、ingress在Kubernetes集群中,Ingress作为集群内服务对外暴露的访问接入点,几乎承载着集群内服务访问的所有流量。Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。可以通过Ingress资源来配置不同的转发规则,从而实现根据不同的规则设置访问集群内不同......
  • 软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
    前言当今软件开发领域中,测试是确保代码质量和功能稳定性的关键步骤。而测试框架是在软件开发过程中使用的工具,有助于组织、管理和执行测试。在这篇文章中,我们将介绍几种常见的测试框架类型:TDD(测试驱动开发)、DDT(数据驱动测试)、BDD(行为驱动开发)和ATDD(行为驱动开发)以及DevOps,本文......
  • django 下拉列表
    1,html原生代码点击跳转<from><selectοnchange="window.location=this.value;"><optionvalue="a.html">用户管理</option><optionvalue="b.html">用户</option></select></form>注意onchange部分,这样即......
  • UPX 可执行文件压缩工具的介绍与使用
    UPX是什么UPX全称是"UltimatePackerforeXecutables",是一个免费、开源、编写、可扩展、高性能的可执行程序打包程序。换句话说一个可执行文件的压缩工具。主要的功能是将可执行的二进制程序、动态链接库和其他的二进制文件压缩为更小的体积,UPX通常可以将文件大小减少50%......
  • 【flink番外篇】6、flink的WaterMark(介绍、基本使用、kafka的水印以及超出最大允许延
    文章目录Flink系列文章一、maven依赖二、示例-Flink1.13.6版本:kafka数据源,每10s统计一次地铁进站每个入口人数1、maven依赖2、实现1)、javabean2)、实现3、验证1)、验证步骤2)、验证三、示例-Flink1.17.0版本:kafka数据源,每10s统计一次地铁进站每个入口人数1、maven依赖2、实现1)、j......
  • 【flink番外篇】6、flink的WaterMark(介绍、基本使用、kafka的水印以及超出最大允许延
    文章目录Flink系列文章一、maven依赖二、示例:每5s统计一次地铁进站每个入口人数1、实现1)、bean2)、实现2、验证三、示例:处理延迟数据超过能接受的时间,每10s统计一次地铁进站每个入口人数1、实现1)、javabean2)、实现2、验证本文介绍了FlinkWaterMark的基本用法以及超过最大延迟允......