数据结构——五十一、散列表的基本概念(王道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 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495642 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117765 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao5 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest