数据结构——散列函数、散列表

文章目录

  • 前言
  • 一、散列表的基本概念
  • 二、散列函数的构造方法
  • 三、处理冲突的方法
    • 1. 开放定址法:
    • 2. 拉链法
  • 四、散列查找及性能分析
  • 总结


前言

  1. 散列表的基本概念
  2. 散列函数的构造方法
  3. 处理冲突的方法
  4. 散列查找及性能分析

提示:以下是本篇文章正文内容,下面案例可供参考

一、散列表的基本概念

  1. 概念:之前的算法建立在“比较”基础上,效率取决于比较次数
    散列函数:将关键字映射成该关键字对应地址的函数,记为Hash(key)=Addr,散列函数会把两个不同的关键字映射到同一地址,称为“冲突”,发生碰撞的不同关键字称为同义词;应尽量减少冲突,设计好的处理冲突的方法
  2. 哈希表:一个有限的连续的地址空间,用以容纳按哈希地址存储的记录。
  3. 哈希函数:记录的存储位置与它的关键字之间存在的一种对应关系。 Loc(ri)=H(keyi)。
  4. 同义词:在同一地址出现冲突的各关键字。
  5. 哈希(散列)地址:根据设定的哈希函数H(key)和处理冲突的方法确定的记录的存储位置。
  6. 装填因子:表中填入的记录数n和哈希表表长 m之比。
  7. α=n/m

二、散列函数的构造方法

  1. 函数定义域必须包括全部需要存储的关键字
  2. 散列函数计算出的地址能够等概率、均匀分布在整个地址空间,减少冲突
  3. 散列函数尽量简单,较短时间内能计算出任意关键字的地址
  1. 直接定址法:散列函数为 ;不会产生冲突,适合关键字分布基本连续的情况,若分布不连续,则空位较多,造成空间浪费
  2. 除留余数法:假定表长为m,取一个不大于m但最接近或等于m的质数p,散列函数为H(key)=key%p(需要选取好p)
  3. 开放定址法 (空缺编址法)
    Hi = ( H(key)+ di ) MOD m
    i=1,2, …, k (km-1)
    m:哈希表的表长; di:增量序列
    1)线性探测再散列 di= 1,2, …, m-1
    缺陷:有聚集(堆积)现象—非同义词地址冲突。
    2)二次探测再散列
    di= 12, -12, 22, -22, 32,…,k2 k  m/2
    缺陷:不易探查到整个散列空间。
    3)伪随机探测再散列 di = 伪随机数序列
    链地址法
    为每个哈希地址建立一个单链表,存储所有具有同义词的记录。
    冲突处理简单,无堆积现象,平均查找长度较短;
    较适合于事先无法确定表长的情况;
    可取α≥1,当结点信息规模较大时,节省空间
    删除结点的操作易于实现
    [设计哈希表的过程]
    1)明确哈希表的地址空间范围。即确定哈希函数的值域。
    2)选择合理的哈希函数。该函数要保证所有可能的记录的哈希地址均在指定的值域内,并使冲突的可能性尽量小。
    3)设定处理冲突的方法。

三、处理冲突的方法

为产生冲突的关键字寻找下一个“空”的Hash地址,用Hi表示冲突后第i次探索的散列地址

1. 开放定址法:

在这里插入图片描述
,m表示表长,di表示增量
(1)线性探索法:di=1开始,每次递增1,向后查找空位,直到找到一个空位或查遍全表;缺点:可能使第i个散列地址同义词存在第i+1个,造成大量相邻的散列地址聚集,大大降低了查找效率
(2)平方探测法:在这里插入图片描述
,k<=m/2 ,m=4k+3,又称二次探测法;可以避免堆积问题,缺点是不能探测到表的全部单元,但至少可以探测到一半
(3)再散列法:使用两个散列函数进行散列
注意:不能随便删除表中元素,因为若删除元素将会截断其他具有相同散列地址的元素的查找地址,所以要想删除一个元素,给它做一个标记,进行逻辑删除,但副作用是表面上看起来散列表很满,实际上有许多位置没有利用

2. 拉链法

(1)为避免非同义词发生冲突,可以把所有同义词存储在一个线性链表中,这个线性链表由散列地址唯一标识,拉链法适用于经常进行插入和删除的情况
在这里插入图片描述

四、散列查找及性能分析

1.散列查找
(1)初始化:根据散列函数计算出散列地址,addr=Hash(key)
(2)检测表中addr位置上是否有记录,没有记录则失败;若有记录比较它与key值,若相等返回成功标志,不然执行下面(3)
(3)用给定的处理冲突的方法计算“下一散列地址”,并把addr置为此地址,转入(2)
在这里插入图片描述

2.散列查找效率:取决于散列函数、处理冲突方法和装填因子
3.装填因子:在这里插入图片描述
平均查找长度依赖于装填因子; 越大,装填记录越满,冲突可能性越大,散列表查找成功与 有关,与表长无关
例题:
例1:已知一组关键字为(26,36,41,38,44,15,68,12,06,51,25),用线性探查法解决冲突构造这组关键字的哈希表。表长取15,哈希函数H(key)=key MOD 13。并求出等概率情况下查找成功的平均查找长度ASL.
在这里插入图片描述
例2:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,设每个记录的查找概率相等
在这里插入图片描述


总结

  1. 散列表的基本概念
  2. 散列函数的构造方法
  3. 处理冲突的方法
  4. 散列查找及性能分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110291.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七天学会C语言-第一天(C语言基本语句)

一、固定格式 这个是C程序的基本框架&#xff0c;需要记住&#xff01;&#xff01;&#xff01; #include<stdio.h>int main(){return 0; }二、printf 语句 简单输出一句C程序&#xff1a; #include<stdio.h> int main(){printf("大家好&#xff0c;&quo…

S7-1200PLC和LED电子看板通信(TCP/IP)

S7-200SMART PLC和LED电子看板通信应用,请查看下面文章链接: SMART 200 PLC UDP通讯应用LED看板_RXXW_Dor的博客-CSDN博客开放式用户通信 (OUC) 库:数据解析:https://rxxw-control.blog.csdn.net/article/details/121424897这篇博客我们主要介绍S7-1200PLC和LED电子看板通…

PowerDesigner 逆向工程以及IDEA中UML插件

1、MySQL数据库连接&#xff08;JDBC方式&#xff09; 1.1 新建一个pdm&#xff0c;dbms选择mysql 1.2 Database - Connect 选择数据库连接 1.3 配置连接信息 数据库连接这里是通过一个配置文件来获取连接信息的&#xff0c;首次的话因为没有&#xff0c;所以我们需要选择…

Michael.W基于Foundry精读Openzeppelin第34期——MerkleProof.sol

Michael.W基于Foundry精读Openzeppelin第34期——MerkleProof.sol 0. 版本0.1 MerkleProof.sol 1. 目标合约2. 代码精读2.1 processProof(bytes32[] memory proof, bytes32 leaf) && processProofCalldata(bytes32[] calldata proof, bytes32 leaf)2.2 verify(bytes32[…

人工智能现在可以从文本中生成具有CD音质的音乐,而且只会越来越好

想象一下&#xff0c;键入“戏剧性的介绍音乐”并听到一首飙升的交响乐&#xff0c;或者编写“令人毛骨悚然的脚步声”并获得高质量的音效。这是稳定音频的承诺&#xff0c;一个文本到音频的人工智能模型周三宣布由能合成立体声的稳定人工智能44.1千赫来自文字描述的音乐或声音…

进化算法、遗传编程和学习

一、说明 进化算法是一系列搜索算法&#xff0c;其灵感来自自然界&#xff08;达尔文主义&#xff09;进化过程。所有不同家庭成员的共同点是&#xff0c;通过应用受自然遗传学和自然选择启发的 算子&#xff0c;通过进化出最初 随机的候选解决方案群体来解决问题&#…

C++之哈希表、哈希桶的实现

哈希表、哈希桶的实现 哈希概念哈希冲突哈希函数哈希冲突解决闭散列哈希表闭散列实现哈希表的结构哈希表的插入哈希表的查找哈希表的删除 开散列开散列概念哈希表的结构哈希表的插入哈希表的查找哈希表的删除 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置…

Vue自动生成二维码并可下载二维码

遇到一个需求&#xff0c;需要前端自行生成用户的个人名片分享二维码&#xff0c;并提供二维码下载功能。在网上找到很多解决方案&#xff0c;最终吭哧吭哧做完了&#xff0c;把它整理记录一下&#xff0c;方便后续学习使用&#xff01;嘿嘿O(∩_∩)O~ 这个小东西有以下功能特点…

HomeAssistant接入天猫精灵

通过巴法云让HomeAssistant接入天猫精灵&#xff0c;实现天猫精灵控制小米等其他第三方智能家具设备。 原文地址&#xff1a;HomeAssistant接入天猫精灵 1、巴法云注册 在https://cloud.bemfa.com/user/index.html?c2 里进行注册&#xff0c; 注册完成后进行登录&#xff…

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日&#xff0c;在ISC 2023第十一届互联网安全大会上&#xff0c;持安科技联合创始人孙维伯作为零信任办公安全赛道代表&#xff0c;亮相数字小镇New50&#xff0c;并发表《全方位防御&#xff1a;零信任理念下的实战攻防》主题演讲。 以下是本次演讲实录&#xff1a; 这几年…

Redis-渐进式遍历scan的使用

目录 1、为什么使用渐进式遍历&#xff1f; 2、scan的使用 3、渐进式遍历的缺点 4、补充知识点&#xff1a;redis中也区分database 1、为什么使用渐进式遍历&#xff1f; 前面的博客中&#xff0c;我们有提到使用keys *来获取所有的key&#xff0c;但这种办法&#xff0c;…

UE5学习笔记(1)——从源码开始编译安装UE5

目录 0. 前期准备1. Git bash here2. 克隆官方源码。3. 选择安装分支4. 运行Setup.bat&#xff0c;下载依赖文件5. 运行GenerateProjectFiles.bat生成工程文件6. 生成完成&#xff0c;找到UE5.sln/UE4.sln7. 大功告成 0. 前期准备 0.1 在windows的话&#xff0c;建议装一个Git…