数据结构——五十一、散列表的基本概念(王道408)

文章目录

前言

本文介绍了散列表(哈希表)的基本概念和工作原理。散列表通过散列函数(如H(key)=key%13)将关键字映射到存储地址,实现快速查找(理想情况下时间复杂度O(1))。文章重点讨论了冲突(不同关键字映射到同一地址)及其解决方法:拉链法(用链表存储同义词)和开放定址法(寻找其他空闲位置)。最后总结了散列表的核心考点,包括散列函数设计、冲突处理策略等。散列表作为一种高效的数据结构,在理想情况下能实现常数级查找性能,但需要合理处理冲突问题。

一.散列表、散列函数的基本概念

1.基本概念

  • 散列表(哈希表,Hash Table) :是一种数据结构。特点是:可以根据数据元素的关键字计算出它在散列表中的存储地址
  • 散列函数(哈希函数):Addr=H(key)建立了"关键字"→"存储地址"的映射关系。

2.具体例子

  • 例:某散列表的长度为13,散列函数H(key)=key%13。依次将数据元素19、14、23插入散列表:

    • 散列表配套的散列函数是H(key)=key%13,用这样的方式去计算出一个数据元素,在散列表当中存储的地址
    1. 把元素19代入这个散列函数得到结果6,数据元素19应该存储在下标为6的位置
    2. 接下来也是一样的操作,不做赘述

3.优势

  • 理想情况下,在散列表中查找一个元素的时间复杂度为O(1)。
  • 比如:
    1. 假设查找19是否存在,那么首先我们要计算19应该存储位置,那根据散列函数可以知道19对13取余等于6
    2. 因此如果19这个数据元素存在的话,那么它应该是在6这个位置,所以我们可以直接查找散列表当中,发现这个元素的值刚好就是19,查找成功
    3. 再比如我们要查找数据元素16,那么16对13取余等于3,所以我们应该检查下标为3的位置,但是下标为3的这个位置并没有存储任何一个数据元素,因此16这个元素在散列表当中是不存在的

二.冲突、同义词的概念

1.基本概念

  • 冲突(碰撞):在散列表中插入一个数据元素时,需要根据关键字的值确定其存储地址,若该地址已经存储了其他元素,则称这种情况为"冲突(碰撞)"
  • 同义词:若不同的关键字通过散列函数映射到同一个存储地址,则称它们为"同义词"

2.举例理解

  • 插入关键字1
    1. 1 % 13 = 1
    2. 但是现在这个位置已经存储了14这个元素,这就叫冲突
    3. 此时将1和14称为同义词

三.如何减少"冲突"

  1. 构造更适合的散列函数,让各个关键字尽可能地映射到不同的存储位置,从而减少"冲突"

四.若"冲突"无可避免,如何处理冲突?

1.拉链法的思路

  • 拉链法(又称链接法、链地址法):把所有"同义词"存储在一个链表中

2.开放定值法思路

  • 开放定址法:如果发生"冲突",就给新元素找另一个空闲位置。

待解决的问题:用什么规则确定"另一个空闲位置"?

五.知识回顾与重要考点

结语

七更😉
如果想查看更多章节,请点击:一、数据结构专栏导航页

相关推荐
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象2 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局2 天前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局2 天前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局2 天前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法