python数据结构与算法 29-1 哈希查找

Python实现哈希查找算法 在此示例中,我们使用简单的取模运算作为哈希函数,将关键字映射到哈希表的索引位置。如果该位置已被占用,则采用线性探测法处理冲突,即向后遍历哈希表,直到找到空闲位置。Python实现哈希查找算法。 阅读详情

前面的章节中,我们利用数据集中元素的相对位置信息来提高查找算法的性能。比如知道列表是有序的,可以使用二分查找。本节我们走得更远一些,创建一个数据结构,使得查找性能提高到O(1),称为哈希查找。

要做到这样的性能,我们要知道元素的可能位置,如果每个元素就在他应该在的位置上,那么要查找的时候只需要一次比较得到有没有的答案,但下面将会看到,不是这么回事。

哈希表是这样一种数据集合,元素的保存的时候就存在容易找到位置上。哈希表表中每一个位置,一般称为槽位,每个槽位都能保存一个数据元素并以一个整数命名(从0开始)。这样我们就有0号槽位,1号槽位等等。起始时,哈希表里没有数据,槽位是空的。这样在构建哈希表的时候,可以把槽位值都初始化为None,图4显示一个大小为11的哈希表,或者是说有m个槽位的哈希表,m从0到10.



图中元素和保存的槽位之间的映射关系,称为哈希函数,哈希函数接受一个元素作为参数,返回一个0到m-1的整数作为槽位名。假如我们有一个整数集54,26,93,17,77和31,我们的第一个哈希函数就可以用“余数法”,简单地将元素除以表的大小,返回余数作为哈希值。(h(item)=item%11),表4是上述整数集的哈希值。

Table 4: Simple Hash Function Using Remainders

Item

Hash Value

54

10

26

4

93

5

17

6

77

0

31

9


注意余数法一般以某种形式存于所有哈希函数中,因为它的结果一定在槽位范围内。

一旦哈希值计算出来,就要把元素插入到哈希表中指定的位置。如图5所示,注意6槽位和11槽位是空的,这就要引入满载因子的概念,一般表述为:

λ=元素数量/哈希表容量


这里,就是


λ=6/11

现在当我们要查找的时候,只要简单地用哈希函数计算出槽位值,然后到表中检查是否存在就可以了,这个查找动作是O(1),因为计算哈希值的时间,以及到表中查找的时间是个常数。如果每件东西都各守其位,我们就发现了一个常数级的查找算法。

也许你已经注意到,这个技术仅在每个元素对应一个位置时有效,例如,上面的例子中如果增加一个44,那么它的哈希值是0,但是77的值也是0,这时问题就出来了,2个值对应同一个槽位,这被称为“collision”,很明显,collision给哈希技术造成了困难,我们随后详细讨论。


哈希函数

对给定的数据集,哈希函数将每个元素映射为单个的槽位,称为“完美哈希函数”,如果我们知道元素和集合固定不变,那么构造一个完美哈希函数也许是可能的。坏消息是对一个任意数据集合,没有一个系统的方法来构造完美哈希函数,好消息是,哈希函数不完美也能提供不错的性能。

如果一定要完美的哈希函数,一种方法是做大哈希表,以保证每个元素都有自己的索引。虽然在数据不多的情况下可行,但是如果数据很大就不可行。比如,如果数据项是8位号码,这就需要十亿个槽位,要是我们仅仅用来保存25个学生的号码,就太费了。

我们的目标是:collision最少,计算简单,分布均匀。有几种扩展余数法的方案,下面讨论其中几个。

折叠法:这种方法把元素分成相等的几片(最后一片可能不相等),然后再把碎片拼起来作为哈希值。比如我们的数据项是号码436-555-4601,那么应该把号码分成2个一组,然后加起来,即43+65+55+46+01,得到210 。假设哈希表有11个槽位,那么再一步用11除210来得到槽位。即210%11=1,所以号码436-555-4601的哈希值是1 。有些折叠法多了一步,在相加之前,把数据位顺序反转,在上面的例子中,即 43+56+55+64+01=219 计算219 % 11=10。

另一种算法叫做“平方取中法”,先计算元素的平方值,再从中提取几位数字,例如,对元素44,先计算442=1936,提取中间两位93,然后再取余数法,得到5(93%11=5)

Table 5: Comparison of Remainder and Mid-Square Methods

表5 余数法与平方取中法的比较

Item

Remainder

Mid-Square

54

10

3

26

4

7

93

5

9

17

6

8

77

0

4

31

9

6

对于字符类元素也能创建哈希函数,单词cat可以看成一个数字串

>>> ord('c')
99
>>> ord('a')
97
>>> ord('t')
116

我们把这三个数字加起来,用余数法计算哈希值。下面是一个计算字符串哈希值的函数:

Listing 1

defhash(astring, tablesize):
    sum=0
    for pos inrange(len(astring)):
        sum=sum+ord(astring[pos])
 
    returnsum%tablesize

有意思的是,上述算法中,相同字母不同顺序的单词得到的哈希值相等,解决办法是加上字母的位置作为重量。图7显示了使用位置作为重量因子,修改后的哈希函数作为练习。

你也可以思考几种计算哈希值的方法,但必须要记住,哈希函数必须要简单高效,不能成为计算的主要负担。如果哈希函数太复杂,计算槽位名的时间超过了简单的顺序查找或二分查找的时间,那么哈希函数还有什么意义呢?




Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射 散列查找算法是一种高效的查找技术,通过散列函数将键映射到数组的索引位置,实现快速的查找、插入和删除操作。本篇博客将介绍散列查找算法的三种常见应用:哈希表、哈希集合和哈希映射,并通过实例代码演示它们的应用。 阅读详情

相关推荐

华为OD机试 - 停车场收入统计 - 数据结构Map(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个停车场某一天的车辆出入记录,请计算该停车场的当日收入,收费规则如下:• 停车半小时收费1元,不足半小时按半小时计算。• 一辆车每天收费封顶15元。• 停车时间小于半小时则不收费• 11:30 - 13:30 不计入停车时间。• 包月的车辆

学Java,找哪吒 383

Python代码简单实现hash查找

Python代码简单实现hash查找

lubuhan的博客 1603

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01

算法设计

weixin_49199313的博客 1501

python哈希查找

哈希函数的选择对哈希查找的效率有很大影响,一个好的哈希函数应该能够将关键字均匀地分布到哈希表中,减少冲突的发生。因此,在实际应用中需要根据具体情况选择合适的哈希函数和解决冲突的方法,以保证哈希查找的效率。这个位置通常称为哈希表或哈希桶。除了使用内置的字典数据结构外,Python还提供了一些哈希查找相关的库和模块,如collections模块中的defaultdict和Counter,它们也可以用于实现哈希查找的功能。需要注意的是,Python中的字典是无序的,因此哈希查找的结果并不是按照插入的顺序返回的。

HYSliuliuliu的博客 3941

感知哈希算法(Python版)

Python3实现基于PHA实现图像配准

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

【数据结构与算法python】哈希查找算法的python实现

1、Hashing 在文章《【数据结构与算法python】顺序查找算法的python实现(无序表)》与《【数据结构与算法python】顺序查找算法的python实现(有序表)中,我们利用数据集中关于数据项之间排列关系的知识, 来将查找算法进行了提升,如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度。 为了进一步降低算法的复杂度,构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为“哈希Hashing” 能够使得查找的次数降低到常数级别, 我们对数据项所处的位置就必

思南的博客 1666

CANoe实战:手把手教你用J1939.dbc发送超8字节长帧报文(附完整CAPL代码)

本文详细解析了使用CANoe和J1939.dbc实现超8字节长帧报文的分包发送技术,提供完整的CAPL代码实现与优化策略。内容涵盖J1939.dbc配置、分包发送模块设计、接收端处理逻辑,并与ISO 15765-2协议进行深度对比,帮助开发者构建高效可靠的商用车通信解决方案。

weixin_29169899的博客 393

python解决哈希查找_python数据结构与算法 29-1 哈希查找

前面的章节中,我们利用数据集中元素的相对位置信息来提高查找算法的性能。比方知道列表是有序的,能够使用二分查找。本节我们走得更远一些,创建一个数据结构,使得查找性能提高到O(1)。称为哈希查找。要做到这种性能,我们要知道元素的可能位置。假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到。不是这么回事。哈希表是这样一种数据集合,元素的保存的时候就存在e...

weixin_28879085的博客 592

基于TI MSPM0的PS2双轴按键摇杆模块ADC+GPIO驱动移植实战

本文详细介绍了在TI MSPM0微控制器上驱动PS2双轴按键摇杆模块的完整实战流程。通过SysConfig图形化工具配置ADC与GPIO引脚,并编写了包含ADC采样、按键检测及数据处理的驱动代码,实现了对摇杆X/Y轴模拟量及按键数字量的稳定读取,为嵌入式控制项目提供了可直接移植的解决方案。

weixin_42465140的博客 83

c764-基于Vue的实时温湿度监控系统

🌟 毕业设计指导交流 🌟 同学们好!作为一名计算机专业的技术爱好者,我在毕业设计领域积累了一些经验,希望能和大家分享交流。从选题到答辩,欢迎一起探讨技术问题。💡 技术方向: 熟悉Java全栈(SSM/Spring Boot)、Python数据分析、微信小程序/安卓开发等技术栈,可以互相学习项目开发经验。📂 学习资源: 整理了一些开源项目案例(含代码和文档),需要参考的同学可以留言讨论,也欢迎分享你的项目经验。🛠 交流内容:✨ 欢迎在评论区留言讨论,一起进步!记得遵守社区规范,保持学术

weixin_39513710的博客 1070

python查看哈希值_python数据结构与算法 29-1 哈希查找

对给定的数据集,哈希函数将每一个元素映射为单个的槽位。称为“完美哈希函数”,假设我们知道元素和集合固定不变。那么构造一个完美哈希函数或许是可能的。坏消息是对一个随意数据集合,没有一个系统的方法来构造完美哈希函数,好消息是。哈希函数不完美也能提供不错的性能。假设一定要完美的哈希函数,一种方法是做大哈希表,以保证每一个元素都有自己的索引。尽管在数据不多的情况下可行,可是假设数据非常大就不可行。比方,假...

weixin_39527768的博客 340

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

数据结构--python 第九章 查找

看了这么久的数据结构,今天终于来到了最后一个章节的总结,虽然前面有两章(树形结构和图形结构)还没有写总结,因为没怎么理解,需要再看一遍之后再写总结。好了,言归正传,下面介绍数据结构中的最后一章的内容:查找 9.1 常见的查找方法: 内部查找与外部查找 静态查找和动态查找 顺序查找、二分法查找、插值查找法、斐波那契查找法、哈希查找法 9.2 哈希查找法 9.3 常见的哈希函数 除留余数...

Jasminexjf的博客 684

使用 MATLAB/Simulink + Simscape Electrical,构建一个含储能的微电网系统,实现储能系统与并网逆变器的协同控制

摘要:本文基于Simulink平台,详细介绍了微电网中储能系统与并网逆变器的协同控制建模与仿真方法。主要内容包括:1)构建包含光伏、风电、锂电池和双向DC-DC变换器的微电网系统;2)设计并网逆变器的PQ/Vf双模式控制策略;3)实现储能系统与逆变器的协同控制逻辑,包括SOC保护和功率分配;4)通过多种工况仿真验证系统性能。结果表明,该系统能有效维持微电网稳定运行,支持并网/离网无缝切换。文章还探讨了优化方向和应用扩展,为新能源微电网控制提供了实用参考。

xiaoheshang_123的博客 101

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 400

python数据结构与算法 29-2 冲突解决

冲突解决 现在返回到前面提到的冲突问题。当两个元素的哈希值指向同一个槽位,就应该有个系统的方法把第二个元素放进表中。这个过程叫做“冲突解决”。我们前面说过的,如果哈希函数是完美的,不会发生冲突。但完美无缺的事很少,所以冲突解决就成为哈希算法中的重要部分。 一种方法是为引起冲突的元素找到另一个位置。简单的做法就是从原来的位置开始,顺序向前查找,直到遇到一个空闲的槽位为止。注意的是我们可能需要

量变到质变 1672

大模型算法岗常见面试题100道

LangChain是一个用于构建和运行大型语言模型应用的开源框架。它提供了一套工具和组件,帮助开发者将大型语言模型(如 GPT-3)与其他工具和API结合,以完成更复杂的任务。1、LangChain包含哪些核心概念?Components:可重用的模块,例如API调用、数据库查询等。Chains:将多个Components链接在一起以完成特定任务的流程。Prompt Templates: 用于指导语言模型生成输出的文本模板。Output Parsers:解析语言模型输出的工具。

具身机器人和通用AI 1959

查找算法(Python 3.7)

1.二分查找 最优时间复杂度:O(1) 最坏时间复杂度:O(logn) 非递归法 ## 非递归 def binary_search(alist,item): first=0 last=len(alist)-1 while first<=last: mid=(first+last)//2 if alist[mid]==item: ...

day day up 832

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python数据结构与算法?

数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个...

weixin_30319097的博客 86

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python字典、集合与函数在AI开发中的高效应用

数据结构是编程语言的核心基础,其中字典、集合和函数在Python中尤为重要。字典基于哈希表实现,提供O(1)时间复杂度的快速查询,非常适合构建词向量映射等AI场景;集合利用哈希特性实现高效去重和集合运算,能大幅提升数据清洗效率;函数则是封装算法逻辑的基本单元,良好的函数设计能提升代码可维护性。这些数据结构在机器学习、自然语言处理等领域有广泛应用,如用字典存储特征编码、集合快速去重、函数封装预处理流程等。通过合理运用字典推导式、defaultdict、装饰器等进阶技巧,开发者可以写出更高效优雅的AI代码。

weixin_30607125的博客 278

python数据结构与算法-17_二叉查找树

所有 key 小于 V 的都被存储在 V 的左子树所有 key 大于 V 的都存储在 V 的右子树注意这个限制条件,可别和堆搞混了。说白了就是对于每个内部节点,左子树的 key 都比它小,右子树都比它大。如果中序遍历(二叉树遍历讲过了)这颗二叉树,你会发现输出的顺序正好是有序的。

xiaoshun007的专栏 140

[SDUT](3377)数据结构实验之查找五:平方之哈希表 ---哈希查找(查找)

数据结构实验之查找五:平方之哈希表 Time Limit:400MSMemory Limit:65536KB SubmitStatisticDiscuss Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲...

110

leetcode 无重复字符的最长子串 python实现

这道题需要借助哈希查找key的O(n) 时间复杂度, 否则就会超时    初始化一个 哈希表\字典 dic 头指针start 初始为0 当前指针 cur 初始为0 最大长度变量 l 初始为0   用cur变量从给定字符串str的开头开始 一位一位的向右查看字符,直到整个字符串遍历完, 对每一位字符进行如下:     当前位置的字符为 c = str[cur]  ...

稀里糊涂林老冷 154

从Python求素数到list与dict的比较

  上学期上网络安全课的时候,杨老简单介绍了一些关于求素数的方法,闲着无聊,把筛选法用python实现了一下,发现有些好玩儿的地方: 原理:   素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。在加密应用中起重要的位置,比如广为人知的RSA算法中,就是基于大整数的因式分解难题,寻找两个超大的素数然后相乘作为密钥的。一个比较常见的求素数的办法是埃拉托斯特尼筛法(t...

weixin_33957648的博客 148
上一篇: python数据结构与算法 31 选择排序
下一篇: python数据结构与算法 29-2 冲突解决
杀了这个男孩
博客等级 码龄18年 149粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值