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实现图像配准

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

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

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

思南的博客 1666

Android GNSS 模块分析(三)JNI 层

Android GNSS;定位服务;GPS;NMEA协议;LocationManagerService;导航;

Yang_Mao_Shan的博客 5161

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

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

weixin_28879085的博客 592

Overleaf+EndNote+BibTeX:手把手搞定Elsevier期刊投稿的参考文献格式(避坑指南)

本文详细介绍了如何利用Overleaf、EndNote和BibTeX三大工具无缝协作,解决Elsevier期刊投稿中的参考文献格式问题。从工具链配置、文献库导出、BibTeX文件优化到Overleaf集成与编译,提供全流程指南和常见问题解决方案,帮助学术新手高效完成Elsevier期刊投稿。

weixin_30616969的博客 512

嵌入式Zephyr RTOS面试题及参考答案

在Zephyr中,为自定义外设编写Devicetree绑定(Bindings)有助于内核理解设备树中自定义外设节点的含义和属性。首先,需要创建一个.yaml格式的绑定文件,通常存放在目录下对应的子目录中,文件名应能反映外设的类型和功能。绑定文件的开头要定义基本信息,包括字段,用于简要描述外设的功能和用途;compatible字段,它是一个字符串列表,用于匹配设备树中自定义外设节点的compatible属性,设备树节点和绑定文件通过这个字段关联起来。接下来,要定义外设节点的属性。使用properties。

大模型大数据攻城狮的专栏 986

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

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

weixin_39527768的博客 340

SpringBoot4+Java21前后端分离架构项目脚手架

本文介绍了基于SpringBoot 4和Java 21的前后端分离项目架构方案。主要内容包括:1)采用Spring Security 7实现JWT无状态认证和RBAC权限控制;2)后端使用MyBatis-Plus简化数据库操作,前端采用Vue3+Pinia组合;3)详细的项目结构设计,推荐按业务模块分包;4)核心依赖配置和架构设计图,涵盖认证授权流程。该方案结合最新技术栈,提供了生产级的全链路实现,特别适合需要快速构建现代化Web应用的项目。

Hello, New World! 422

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

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

Jasminexjf的博客 684

3大绝招!MySQL如何轻松搞定文本、图像和视频的多模态数据分析?

首先,让我们来了解一下“多模态”到底是什么意思。简单来说,多模态指的是能够同时处理不同类型数据(如文本、图像、音频等)的能力。传统的数据库往往只能专注于一种或几种特定类型的数据,比如关系型数据库主要处理结构化数据,而文档型数据库则更适合非结构化数据。但是现在,随着技术的进步,像MySQL这样的数据库也开始支持更加复杂的数据模型,允许我们在同一个系统内处理多种格式的数据。通过上述五个部分的详细介绍,相信你现在应该对如何利用MySQL进行多模态数据分析有了更清晰的认识。

java专栏 2116

YOLOv12涨点优化:自研检测头 | 独家创新(Partial_C_v12Detect)检测头结构创新,实现涨点

现有12Detect进行二次创新,提升检测精度,独家创新(Partial_C_12Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 633

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

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

量变到质变 1672

vue3 - 超详细 cropper.js 实现图片(头像)裁剪效果功能,在vue3中上传图像后按比例进行图片的裁剪及实时预览,Element / Ant Desi(详细示例源码,一键复制开箱即用!)

vue3图片裁剪及实时预览,vue3 vue-cropper,vue3头像裁剪,vue3 el-upload+vue-cropper 图像图片头像裁剪上传,vue3怎么进行图片的裁剪,vue3使用vue-cropper图片裁剪,vue3项目如何实现头像图片裁剪上传功能,vue3网站pc怎么将上传的图片按比例进行裁剪,vue3+element plus实现图片上传按尺寸大小裁剪,vue3中图片上传使用cropperjs 头像裁剪,vue3中图片上传使用cropperjs 头像裁剪,vue3好用的图片裁剪插件组

✅ 精选推荐文章 4506

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python数据结构与算法?

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

weixin_30319097的博客 86

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_30607125的博客 278

NTscan扫描工具

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

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

余额充值