数据结构——五十一、散列表的基本概念(王道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.开放定值法思路

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

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

五.知识回顾与重要考点

结语

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

相关推荐
catchadmin3 分钟前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路33 分钟前
go-grpc设计思想
开发语言·后端·golang
小豆庄35 分钟前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘561 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
酷炫码神1 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
careathers2 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
Elastic 中国社区官方博客2 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1882 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
小黄人软件2 小时前
桌面需要整理吗?有工具自动分类
学习
步行cgn3 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc