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,找哪吒 384

Python代码简单实现hash查找

Python代码简单实现hash查找

lubuhan的博客 1603

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

算法设计

weixin_49199313的博客 1501

python哈希查找

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

HYSliuliuliu的博客 3941

感知哈希算法(Python版)

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

RedPitaya火龙果板基础操作

火龙果板基础操作一级目录二级目录三级目录 一级目录 二级目录 三级目录

qq_41523340的博客 9725

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

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

思南的博客 1666

UE5新手必看:Gameplay框架中的GameInstance与子系统实战指南(含蓝图配置)

本文为UE5新手提供了Gameplay框架中GameInstance与子系统的实战指南。文章深入解析了GameInstance作为全局数据中枢的核心作用与生命周期,并手把手演示了如何创建自定义GameInstance、构建模块化的子系统(如存档管理),以实现跨关卡的持久数据管理。指南旨在帮助开发者构建清晰、可维护的项目架构,解决数据管理混乱的常见痛点。

weixin_29015801的博客 575

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

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

weixin_28879085的博客 592

Solidworks在Windows 11上安装失败?这里有解决方案

通过上述步骤,你应该能够解决在Windows 11上安装Solidworks时遇到的问题。这个方法通过调整注册表的设置,提高了安装程序的权限,从而有效避免了安装过程中的权限障碍。当然,每个系统的具体情况可能有所不同,如果在尝试上述方法后仍然无法解决问题,建议联系Solidworks的技术支持团队,获取更专业的帮助。希望本文能够对你有所帮助,祝你工作顺利,设计无忧!

nntxthml的博客 4912

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

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

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

weixin_39527768的博客 340

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

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

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

Jasminexjf的博客 684

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

Flutter:如何在Android中实现串口通信调试

本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。

sg_knight的专栏 6098

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

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

量变到质变 1672

57. SAP UI5 应用基于 OData 注解的 Smart Field 使用方法学习

所谓 SAP UI5 Smart Field,顾名思义,是一类比较`智能`的控件,这类控件同 SAP UI5 传统的控件不同,会根据 SAP UI5 应用程序连接的 OData 服务中元数据里提供的注解(`annotations`),在运行时动态生成底层的 SAP UI5 控件。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2771

查找算法(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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python数据结构与算法?

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

weixin_30319097的博客 86

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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、付费专栏及课程。

余额充值