前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python:说说字典和散列表,散列冲突的解决原理

Python:说说字典和散列表,散列冲突的解决原理

作者头像
丹枫无迹
发布于 2019-03-15 08:05:19
发布于 2019-03-15 08:05:19
2.1K0
举报
文章被收录于专栏:学无止境学无止境

Python 用散列表来实现 dict。

散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。在一般书中,散列表里的单元通常叫做表元(bucket)。在 dict 的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对值的引用。因为每个表元的大小一致,所以可以通过偏移量来读取某个表元。

Python会设法保证大概还有三分之一的表元是空的,当快要达到这个阀值的时候,会进行扩容,将原散列表复制到一个更大的散列表里。

如果要把一个对象放入到散列表里,就先要计算这个元素键的散列值。这就要求键(key)必须是可散列的。

一个可散列的对象必须满足以下条件:

  1. 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列值是不变的。
  2. 支持通过 __eq__() 方法来检测相等性。
  3. 若 a == b 为真,则 hash(a) == hash(b) 也为真。

下面主要来说明一下散列表的算法:

为了获取键 search_key 所对应的值 search_value,python 会首先调用 hash(search_key) 计算 search_key 的散列值,把这个值最低的几位数字当作偏移量,在散列表里查找表元(具体取几位,得看当前散列表的大小)。若找到的表元是空的,则抛出 KeyError 异常;若不为空,则表元里会有一对 found_key:found_value,检验 search_key 和 found_key 是否相等,若相等,则返回 found_value。若不相等,这种情况称为散列冲突。

为了解决散列冲突,算法会在散列值中另外再取几位,然后用特殊的方法处理一下,把得到的新数值作为偏移量在散列表中查找表元,若找到的表元是空的,则同样抛出 KeyError 异常;若非空,则比较键是否一致,一致则返回对应的值;若又发现散列冲突,则重复以上步骤。

添加新元素跟上面的过程几乎一样,只不过在发现空表元的时候会放入这个新元素,不为空则为散列重复,继续查找。

当往 dict 里添加新元素并且发生了散列冲突的时候,新元素可能会被安排存放到另一个位置。于是就会发生下面的情况:dict([key1, value1], [key2, value2]) 和 dict([key2, value2], [key1, value1]) 两个字典,在进行比较的时候是相等的,但如果 key1 和 key2 散列冲突,则这两个键在字典里的顺序是不一样的。

无论何时,往 dict 里添加新的键,python 解析器都可能做出为字典扩容的决定。扩容导致的结果就是要新建一个更大的散列表,并把字典里已有的元素添加到新的散列表里。这个过程中可能发生新的散列冲突,导致新散列表中键的次序变化。如果在迭代一个字典的同时往里面添加新的键,会发生什么?不凑巧扩容了,不凑巧键的次序变了,然后就 orz 了。

由于散列表必须是稀疏的,这导致它在空间上的消耗必然要大很多,这是典型的空间换时间。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
计算机网络中科大 - 第7章 网络安全(详细解析)
用户Alice登录某银行网站时,攻击者Trudy在她与服务器之间插入中间节点,成功劫持数据。
知孤云出岫
2025/04/16
1160
计算机网络中科大 - 第7章 网络安全(详细解析)
100 个网络安全基础知识
网络安全是指采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,保障网络数据的完整性、保密性、可用性。(参考《中华人民共和国网络安全法》)
ICT系统集成阿祥
2025/04/14
2780
100 个网络安全基础知识
软件设计师——信息安全
常见对称密钥(共享秘钥)加密算法:DES、3DES(三重DES)、RC-5、IDE算法。
秋邱
2024/10/09
2040
软件设计师——信息安全
系统分析师信息安全知识点
Stub区域是一种比较特殊的区域,因为它不能像其他区域那样,经过该区域中的ABR接收其他OSPF AS路由。在Stub区域的内部路由器仅需要配置一条到达该区域ABR的默认路由(0.0.0.0.0.0.0.0)来实现与同一AS中不同区域间的路由,这样可使得这些区域中的内部路由器的路由表的规模以及路由信息传递的数量都会大大减少。
小马哥学JAVA
2023/07/15
2590
系统分析师信息安全知识点
软考中级(软件设计师)——计算机网络(5分)与信息安全(3分)
这里的一些关键词需要注意,例如(PSTN)是公用交换电话网络,(DDN)是数字数据网等。 
红目香薰
2022/11/30
4060
软考中级(软件设计师)——计算机网络(5分)与信息安全(3分)
软考分类精讲-系统安全分析与设计
对称加密技术 缺点 1.加密强度不高,但效率高。 2.密钥分发困难 常见的对称秘钥加密方法 DES:替换+位移、56位密钥、64位数据块、速度快、密钥易产生 3DES(三重DES):两个56位的密
cwl_java
2019/10/26
4350
再有人问你网络安全是什么,把这篇文章丢给他!
网络安全:指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。
Java程序猿
2023/02/23
8100
计算机网络安全思考题
该密码体制有一个参数n。在加解密时,同样把英文字母映射为0-25的数字再进行运算,并按n个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合,因此可表示
十二惊惶
2024/02/28
3860
计算机网络安全思考题
系统分析师模拟概念系列2
HTTP是超文本传输协议,采用的是标准端口80端口。HTTPS=HTTP+SSL,所以HTTPS中使用了SSL作为加密协议。
小马哥学JAVA
2023/02/27
2750
系统分析师模拟概念系列2
系统分析师章节练习高频错题
对于多核cpu,优化操作系统任务调度算法是保证效率的关键。一般任务调度算法有全局队列调度和局部队列调度。
小马哥学JAVA
2023/07/15
1940
系统分析师章节练习高频错题
【系统架构】第四章-信息安全技术基础知识
三、信息存储安全:信息使用的安全(如用户的标识与验证、用户存取权限限制、安全问题跟踪等)、系统安全监控、计算机病毒防治、数据的加密和防治非法的攻击等 1、信息使用的安全
阿提说说
2023/10/16
6990
系统分析师模拟题概念
防火墙技术可以分为网络级别防火墙和应用级别防火墙两类,网络级别防火墙用来防止整个网络出现外来非法的入侵。例如:分组过滤和授权服务器就属于这一类。前者检查所有流入本网的信息,然后拒绝不符合事先制定好的一套准则的数据,而后者则是检查用户的登录是否合法;应用防火墙是从应用程序来进行接入控制,通常使用应用网络或代理服务器来区分各种应用。例如允许www应用,而阻止FTP应用。
小马哥学JAVA
2023/02/27
2720
系统分析师模拟题概念
网络安全与信息安全【知识点】
是指利用网络管理控制和技术措施,保证在一个网络环境里,信息数据的机密性、完整性及可使用性受到保护。
MIKE笔记
2023/03/22
7520
网络安全与信息安全【知识点】
【信管1.16】安全(三)信息系统安全
上一篇课程的内容大家还记得吗?如果不记得了还是要多多复习一下哦,今天的内容相对来说要略微简单一些,所以大家也不用太紧张啦!今天的内容主要是讲解从技术的各个方向上来构建整个信息安全体系,内容从硬件、网络到病毒木马都会简单地介绍一下,还是比较杂,但并不深入,大家即使不是从事安全行业的也不会对这些知识太过陌生,总体比加解密之类的内容还是要好理解很多。
硬核项目经理
2023/03/02
5110
【信管1.16】安全(三)信息系统安全
计算机网络原理梳理丨网络安全
明文:未被加密的消息 密文:被加密的消息 加密:伪装消息以隐藏消息的过程 解密:密文转变为明文的过程
码脑
2019/04/11
8880
计算机网络原理梳理丨网络安全
1.4计算机安全防护知识 计算机专业理论基础知识整理
1.计算机病毒不仅有文件型,还有引导型、混合型病毒,只删除磁盘上所有的文件是不能清除磁盘中引导型或混合型病毒的;用杀毒软件也只能清除已知的病毒,对新型病毒,则不一定能检测和清除;用完全格式化磁盘的方法,则可以清除各种类型的计算机病毒。
刘金玉编程
2021/06/21
7360
1.4计算机安全防护知识 计算机专业理论基础知识整理
网络安全漫谈及实战摘要
在最近一周内,我收到了安全圈子里面小伙伴的私信,说他们非常喜欢信息安全,但是看了我之前发布文章,觉得有点难度,还涉及到C#编程,不好理解,希望我能给些基础方面的文章,所以有了这篇技术稿。
知识与交流
2021/04/02
5120
网络安全漫谈及实战摘要
信管知识梳理(五)信息系统安全技术
信息加密是指利用加密技术伪装信息,使未授权者不能理解它的真实含义。加密前的原始数据称为明文,加密后的数据称为密文,从明文到密文的过程称为加密(Encryption)。用于对数据加密的一组数学变化称为加密算法,加密在加密密钥的控制下进行。对数据加密的技术主要分为两类:
归思君
2023/10/16
6920
【新星计划】你真的了解计算机病毒吗?[通俗易懂]
在生物学上,病毒是一个低级的生命体, 在网络安全方面,计算机病毒是一种靠修改其它程序来插入或进行自身拷贝,从而感染其它程序的一种程序。 在我国给了计算机病毒更详细的定义:计算机病毒,是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并能自我复制的一组计算机指令或者程序代码。——《中华人民共和国计算机信息系统安全保护条例》第二十八条
全栈程序员站长
2022/08/31
1.1K0
【新星计划】你真的了解计算机病毒吗?[通俗易懂]
数据库系统工程师笔记(一)计算机系统
执行所有的算术运算。加减乘除等 执行所有的逻辑运算。逻辑与、逻辑非、逻辑或。 组成:
Maynor
2024/05/26
1400
数据库系统工程师笔记(一)计算机系统
推荐阅读
相关推荐
计算机网络中科大 - 第7章 网络安全(详细解析)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档