算法导论 11章 散列表

算法导论第十一(11)章散列(Hash)表 11.1直接寻址表 关键字集合U = { 0, 1, ..., m - 1 },实际的关键字集合K。 用一个数组T[0..m - 1],其中每个位置对应U中的一个关键字k。 把关键字k映射到槽T(k)上的过程称为散列。 散表表仅支持INSERT、SEARCH、DELETE操作。 11.1-1假设一动态集合S用一个长度为m的直接寻址表T表示。请给出一个查找S中最大元素的过程。你所给的过 阅读详情

散列表是实现字典操作的一种有效数据结构

散列表是普通数组概念的推广

散列表使用一个长度与实际存储的关键字数目成比例的数组来存储,根据关键字计算相应的下标。

直接寻址表

缺点:

(1)如果U很大,要保存|U|大小的一张表T有点不实际。
(2)实际存储的关键字集合K相对U来说可能很小,因而分配给T的大部分空间都要浪费掉。

散列表

利用散列函数K计算出槽的位置。

冲突:两个关键字可能映射到同一个槽中。

冲突解决方法:
1)链接法

装载因子:给定一个能存放n个元素的、具有m个槽位的散列表T,装载因子定义为n/m。含义是一个链中平均存放的元素数。

简单一致散列:任何元素散列到m个槽中每一个的可能性是相同的,且与其他元素已被散列到什么位置独立无关。

定理:对一个用连接技术来解决碰撞的散列表,在简单一致散列的假设下,一次不成功查找的期望时间为θ(1+α),这个时间包含计算h(k)的时间。

定理:在简单一致散列的假设下,对于用链接技术解决碰撞的散列表,平均情况下一次成功的查找需要θ(1+α)时间。

2)开放寻址法

散列函数

好的散列函数的特点:

每个关键字都被等可能的散列到M个槽位中的任何一个,与其他关键字已散列到哪个槽位无关
将这些相近符号散列到相同槽中的可能性最小化。

除法散列法

通过取k除以m的余数,将关键字k映射到m个槽的某一个中去。
散列函数为:h(k)=k mod m 。
m不应是2的幂,通常m的值是与2的整数幂不太接近的质数。

乘法散列法

乘法散列法构造散列函数需要两个步骤。第一步,用关键字k乘上常数A(0<A<1),并抽取kA的小数部分。然后,用m乘以这个值,再取结果的底。
散列函数如下:h(k) = m(kA mod 1)。

全域散列法

 给定一组散列函数H,每次进行散列时候从H中随机的选择一个散列函数h,使得h独立于要存储的关键字。全域散列函数类的平均性能是比较好的。

开放寻址法

线性探查

h(k, i) = (h'(k) + i) mod m, i = 0, 1, ... ,m - 1

在线性探查方法中,初始探查位置确定了整个序列,因此只有m种不同的探查序列。且它存在一次群集现象。

二次探查

h(k, i) = (h'(k) + c * i + d * i^2) mod m

其中c和d为辅助常数。初始探查位置为T[h'(k)],后续的探查位置要在此基础上加上一个偏移量,该偏移量以二次的方式依赖于探查号i。它比线性探查好的多。但是如果两个关键字初始探查位置相同,那么他们的探查序列也是相同的。因此它存在程度较一次群集轻的二次群集现象。

双重散列

h(k, i) = (f(k) + i * g(k)) mod m

其中f(k)和g(k)为辅助散列函数。与线性探查和二次探查不同的是,这里的探查序列以两种方式依赖于关键字k。为能查找整个散列表,值g(k)要与m互素。可以取m为2的幂,并设计g(k)为总产生奇数。或者取m为素数,设计g(k)总产生比m小的正整数。比如:可以取m为素数,并取f(k) = k mod m, g(k) = 1 + (k mod n) 其中n略小于m(比如为m - 1)。双重散列法用了θ(m^2)种探查序列。

完全散列

如果某一种散列技术在进行查找时,其最坏情况内存访问次数为O(1)的话,则称其为完全散列(perfect hashing)。通常利用一种两级的散列方案,每一级上都采用全域散列。为了确保在第二级上不出现碰撞,需要让第二级散列表Sj的大小mj为散列到槽j中的关键字数nj的平方。如果利用从某一全域散列函数类中随机选出的散列函数h,来将n个关键字存储到一个大小为m=n的散列表中,并将每个二次散列表的大小置为mj=nj2 (j=0, 1, …, m-1),则在一个完全散列方案中,存储所有二次散列表所需的存储总量的期望值小于2n。

算法导论第十一章习题解答 本章问题较多的设计到数论与概率工具,由于对数学工具掌握的不够熟悉,有些习题尚未完成 立即下载

相关推荐

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1093

算法导论11章散列表 思考题总结

11-1 (散列最长探查的界) 采用开放寻址法,用一个大小为 m 的散列表来存储 n ( n a. 假设采用均匀散列,证明:对于 i = 1,2,... ,n,第 i 次插入需要严格多于 k 次探查的概率至多为 2^(-k) 。 ANSWER: b. 证明:对于 i = 1,2,... ,n,第 i 次插入需要多于 2lgn 次探查的概率为 O( 1/ n^2 )。 ANSWER

chan15的博客 3702

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1199

算法导论-第11章-散列表

一、概念 1.综述 散表表仅支持INSERT、SEARCH、DELETE操作。 把关键字k映射到槽h(k)上的过程称为散列。 多个关键字映射到同一个数组下标位置称为碰撞。 好的散列函数应使每个关键字都等可能地散列到m个槽位中 2.散表函数 (1)若函数为h(k)=k,就是直接寻址表 (2)除法散列法:h(k) = k mod m (3)乘法散列法:h(k) = m * (

幸福在路上 8754

Android逆向实战:抖音聊天记录数据库解析与导出(附完整SQL查询)

本文提供了一份Android逆向实战指南,详细解析了抖音聊天记录数据库的结构与导出方法。通过定位核心的`im.db`数据库文件,深度解读conversation_list、msg等关键表结构,并附上完整的SQL查询语句,帮助开发者或研究人员安全、合规地提取和分析本地聊天数据,适用于移动安全研究与数据分析场景。

mango的博客 858

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结)

数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。

ai_blue_pm的博客 281

散列表设计

散列表设计(刘爱贵 - Aiguille.LIU)1、基本概念  散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2、常用的构造散列函数的方法  散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数

刘爱贵的专栏 6220

4、Vitis_HLS、Vivado 和 Vitis IDE 工具的设置与使用

本文详细介绍了使用Vitis_HLS、Vivado和Vitis IDE进行FPGA开发的完整流程,涵盖开发板选择、软件安装、IP设计与模拟、综合、导出以及在FPGA上的实现与验证。以Xilinx Artix-7和Zynq系列开发板为例,指导用户从环境搭建到最终硬件验证,完成一个32位加法器IP的开发,适用于嵌入式系统和硬件加速项目的学习与实践。

fff88的博客 181

《算法导论》第 11 章 - 散列表

本文摘要:文章系统讲解了散列表(HashTable)的核心知识,包括直接寻址表、链地址法和开放寻址法的实现原理及代码示例(C++)。重点分析了三种散列函数(除法、乘法、全域散列)的特点,并详细比较了不同冲突解决方法的性能。通过词频统计等实际案例,展示了散列表的高效查找特性(平均O(1)时间复杂度)。文章还探讨了负载因子对性能的影响,介绍了完全散列等高级技术。最后提出思考题,引导读者深入理解散列表的设计考量与应用场景。

2302_80961196的博客 1008

第12篇:TMC2240 CoolStep节能功能|软件配置+功耗测试(保姆级)

本文介绍了TMC2240驱动芯片的CoolStep节能功能,通过动态调节电机电流实现功耗优化。CoolStep利用StallGuard技术实时检测负载,自动调整运行电流,空载时可降低50%以上功耗。文章详细讲解了节能原理、寄存器配置方法和参数校准步骤,提供可直接复用的STM32代码。该功能特别适合电池供电设备,能显著延长续航时间,同时保持电机性能稳定。配置时需注意SG阈值、电流步长等关键参数,并可与静音模式叠加使用。

BackCatK Chen的博客 919

基于江协科技STM32创建HAL库工程模板

基于江协科技STM32入门教程创建的HAL库工程模板

2401_82728381的博客 1134

算法导论第11章 散列表(哈希表)

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详细的描述,如闲聊哈希表 ,这里就不再累述了; 哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食;在网上google了一把,大致有几个版本,我会一一来分析

Jerry的专栏 892

EXCEL VBA从入门到精通 前言

本书通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程,同时也介绍了常用的工具、资源、社区和协作平台等,方便读者进行进一步的学习和开发。我强烈推荐这本书给所有希望学习和掌握Excel VBA编程的读者。多样化的资源和工具介绍:本书介绍了丰富的工具和资源,包括官方文档、在线教程、代码库、论坛、博客等,方便读者进行进一步的学习和开发。详细的讲解和丰富的示例:本书从语法和对象开始讲解,通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程。第一节:什么是VBA 5。

1729

《算法导论》第三版第11章 散列表 练习&思考题 个人答案

11.1 直接寻址表 11.1-1 解: DIRECT-ADDRESS-FINDMAX(T) for i = T.length - 1 to 0 if T[i] != NIL return T[i] 最坏情况O(m)O(m)O(m)。 11.1-2 思路:1代表存在,0代表不存在;插入置位,删除复位。 11.1-3 思路:可以将寻址表的每一个元素指向包含相同关键字的一个双...

张劲声的博客 4166

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《算法导论》第11章 散列表 练习题

11.1-4 我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化是不实际的,因为该组的规模太大。(提示:可以利用另外一个栈,其大小等于实际存储在字典中的关键字数目,以帮助确定大型数组中某个给定的项是否是有效的。所有三种字典操作(INSERT,DELETE和 SEARCH)的时间应为O(1)。11.1-2 位向量(bit vector)是一种仅包含0和1的数组。11.1-1 考虑由一个长度为m的直接寻址表T表示的动态集合S。

客舟中 457

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《算法导论》第11章 散列表 (1)直接寻址表

(一)直接寻址表 关键字集合U = { 0, 1, ..., m - 1 },实际的关键字集合K。 用一个数组T[0..m - 1],其中每个位置对应U中的一个关键字。 直接寻址表的问题: (1)如果U很大,要保存|U|大小的一张表T有点不实际。 (2)实际存储的关键字集合K相对U来说可能很小,因而分配给T的大部分空间都要浪费掉。

西代零零发 4965

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《算法导论》学习总结 — 10. 第10章(略) && 第11章 散列表

建议先看看前言:http://www.wutianqi.com/?p=2298 第10章没法说,数据结构还是看严奶奶的比较好,所以《算法导论》上的这一章我随便瞄了几眼就过去了,不过话说回来,数据结构非常重要!!!所以,大家最好把严蔚敏的《数据结构》认认真真的看N遍!!! 另外,推荐看看这个: 数据结构的源码实现:http://www.cpp leyuan.com/viewthread....

weixin_30820151的博客 126

算法导论 第11章 散列表

散列表是主要支持动态集合的插入、搜索和删除等操作,其查找元素的时间在最坏情况下是O(n),但是在是实际情况中,散列表查找的期望是时间是O(1),散列表是普通数组的推广,因为可以通过元素的关键字在数组对元素进行直接定位,所以能够在O(1)时间内访问数组的任意元素。

程序缘 1683

算法导论第11章 散列表

  自己看算法导论整理的文档,包括每节内容和课后习题。   链接见百度网盘:https://pan.baidu.com/s/1VGNkFnKCDrvnYnm-QP5CWQ   密码:50w6 转载于:https://www.cnblogs.com/lijunqiang1997/p/8717306.html...

weixin_30709809的博客 142

《算法导论》笔记 第11章 11.2 散列表

【笔记】 【练习】

Azarath Metrion Zinthos 1159

【算法导论】第11章散列表

1、问题引入   散列表示普通数组概念的推广,,,,当实际存储的关键字数比可能的关键字总数较小时,采用散列表就会比直接数组寻址更为有效,因为散列表通常采用的数组尺寸与所要存储的关键字数成正比。散列表中主要着重解决“碰撞”问题,所谓“碰撞”就是多个关键字映射到同一个数组下标位置,这里讲采用除法散列法对关键字进行散列,对出现的冲突利用链接法进行解决。 2、具体实现   具体参见:(采用链地址法处...

weixin_34357887的博客 140

算法导论答案 第11章:散列表

11.1-1 findmax(T,m) { max=T[0]; for i=1 to m-1 { if T[i]!=NIL && T[i]>max max=T[i] } return max }

ssyyifa的专栏 1314

《算法导论》第11章 散列表 个人笔记

第11章 散列表 11.1 直接寻址表 11.2 散列表 11.3 散列函数 11.4 冲突

Amber07的笔记本 552

算法导论代码 第11章 散列表

第11章 散列表 11.2 散列表 #include #include /*通过链接法解决碰撞*/ typedef struct hash_chain_type *hash; typedef struct list_type *list; struct list_node { void *key; struct list_node *prev; struct list_node *n

MoXiaopeng的专栏 731

《算法导论》第11章:散列表

一、直接寻址表 类似于计数数组,表中每一个槽只能放一个指针,一旦发生冲突无法解决 二、哈希表的链接法 每个槽保存一个链表,若是双链表可以方便删除 效率分析:一次不成功查找的平均时间为θ(1+α),其中α=n/m称为装载因子。因此当槽的个数m为n的常数倍时,可以认为一次哈希操作耗费O(1)的时间 哈希函数 除法【形式简单】:h(k)=k%m,其中m不能取2^n,否则相当于取k的后n位数 ...

Salmon_lee的博客 392
上一篇: 算法导论 14章 数据结构的扩张
下一篇: 算法导论 16章 贪心算法
cqcpp
博客等级 码龄12年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值