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

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

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

五.知识回顾与重要考点

结语

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

相关推荐
恣逍信点3 分钟前
《凌微经 · 理悖相涵》第六章 理悖相涵——关系构型之模因
人工智能·科技·程序人生·生活·交友·哲学
晚霞的不甘5 分钟前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频
小程故事多_805 分钟前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
沐知全栈开发6 分钟前
SQL 日期处理指南
开发语言
望舒5138 分钟前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖9 分钟前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖14 分钟前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
独好紫罗兰19 分钟前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
C++ 老炮儿的技术栈23 分钟前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
KYGALYX28 分钟前
逻辑回归详解
算法·机器学习·逻辑回归