文章目录
前言
本文介绍了散列表(哈希表)的基本概念和工作原理。散列表通过散列函数(如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,用这样的方式去计算出一个数据元素,在散列表当中存储的地址
- 把元素19代入这个散列函数得到结果6,数据元素19应该存储在下标为6的位置

- 接下来也是一样的操作,不做赘述

3.优势
- 理想情况下,在散列表中查找一个元素的时间复杂度为O(1)。
- 比如:
- 假设查找19是否存在,那么首先我们要计算19应该存储位置,那根据散列函数可以知道19对13取余等于6
- 因此如果19这个数据元素存在的话,那么它应该是在6这个位置,所以我们可以直接查找散列表当中,发现这个元素的值刚好就是19,查找成功
- 再比如我们要查找数据元素16,那么16对13取余等于3,所以我们应该检查下标为3的位置,但是下标为3的这个位置并没有存储任何一个数据元素,因此16这个元素在散列表当中是不存在的
二.冲突、同义词的概念
1.基本概念
- 冲突(碰撞):在散列表中插入一个数据元素时,需要根据关键字的值确定其存储地址,若该地址已经存储了其他元素,则称这种情况为"冲突(碰撞)"
- 同义词:若不同的关键字通过散列函数映射到同一个存储地址,则称它们为"同义词"
2.举例理解

- 插入关键字1
- 1 % 13 = 1

- 但是现在这个位置已经存储了14这个元素,这就叫冲突
- 此时将1和14称为同义词
- 1 % 13 = 1
三.如何减少"冲突"
- 构造更适合的散列函数,让各个关键字尽可能地映射到不同的存储位置,从而减少"冲突"
四.若"冲突"无可避免,如何处理冲突?
1.拉链法的思路

- 拉链法(又称链接法、链地址法):把所有"同义词"存储在一个链表中
2.开放定值法思路

- 开放定址法:如果发生"冲突",就给新元素找另一个空闲位置。
待解决的问题:用什么规则确定"另一个空闲位置"?
五.知识回顾与重要考点

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