字典核心底层原理

news2024/10/7 8:25:16

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket。每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。

由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。
在这里插入图片描述

将一个键值对放进字典的底层过程

a = {}
a["name"]="gaoqi"

假设字典a对象创建完后,数组长度为8:

image-20211026182600994

我们要把”name”=”gaoqi”这个键值对放到字典对象a中,首先第一步需要计算键”name”的散列值。Python中可以通过hash()来计算。

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即“101”,十进制是数字5。我们查看偏移量5,对应的bucket是否为空。如果为空,则将键值对放进去。如果不为空,则依次取右边3位作为偏移量,即“100”,十进制是数字4。再查看偏移量为4的bucket是否为空。直到找到为空的bucket将键值对放进去。流程图如下:

image-20211109182613384

扩容

python会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组中。
接近2/3时,数组就会扩容。

根据键查找“键值对”的底层过程

明白了,一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就简单了。

>>> a.get("name")
'tiantian'

当调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值对象“gaoqi”。

我们仍然要首先计算“name”对象的散列值:

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

和存储的底层流程算法一致,也是依次取散列值的不同位置的数字。 假设数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即101,十进制是数字5。我们查看偏移量5,对应的bucket是否为空。如果为空,则返回None。如果不为空,则将这个bucket的键对象计算对应散列值,和我们的散列值进行比较,如果相等。则将对应“值对象”返回。如果不相等,则再依次取其他几位数字,重新计算偏移量。依次取完后,仍然没有找到。则返回None。流程图如下:

image-20211109184400622

用法总结:

  1. 字典在内存中开销巨大,典型的空间换时间。
  2. 键查询速度很快
  3. 往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改
  4. 键必须可散列
    • 数字、字符串、元组,都是可散列的
    • 自定义对象需要支持下面三点:(面向对象章节中再展开说)
      1. 支持hash()函数
      2. 支持通过__eq__()方法检测相等性
      3. 若a==b为真,则hash(a)==hash(b)也为真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服装厂的管理系统如何选?内行人:这4点一定要注意!

服装厂管理水平偏低,耗费大量时间和资金成本,导致利润越来越低,是现在很多中小服装厂普遍面临的痛点。 依靠传统的管理模式,口头询问生产进度,手写统计数量,很显然不适合现代工厂的管理模式,服装…

java开发记录V1

编辑器vscode 在vscode中安装配置springboot 下载安装jdk oracle jdk BellSoft Liberica JDK version 17 在vscode编辑器中安装相关组件Extension Pack for Java、Spring Boot Extension Pack、Spring Initializr Java Support 创建springboot项目:ctrlshiftp后…

【Midjourney】Midjourney 辅助工具 ① ( 自定义命令工具 | 设置描述词 | 设置风格 | 设置灯光 | 设置相机 | 设置艺术家 )

文章目录 一、Midjourney Prompt Tool 自定义命令工具1、设置描述词2、设置风格3、设置灯光4、设置相机参数5、设置艺术家参数 Midjourney 提示词命令 可以使用 辅助工具 进行生成 , 辅助工具如下 : Midjourney Prompt Tool 自定义命令工具Midjourney Prompt Generator 命令生…

软件测试踏入这三个误区,就离滚蛋不远了

误区一:测试都是女生,男生不适合 误区二:这个职位很简单,不需要很多技术含量,每天很闲 误区三:起步即巅峰,薪资提升空间不大,一线才八九千 如果你听到这样的言论,赶紧走…

AssetBundle加载与卸载时的内存变化

AssetBundle.LoadFromFile加载一个80MB的assetbundle会分配1MB左右的pss内存 adb分析:private-otherUnityProfiler分析:有3块 1.Other/AssetBundle/LoadingCache 2.Other/SerializedFile/archive:/CAB-e42axxxxxxx 3.NotSaved/AssetBundle/xxxxxx.ab …

陷入“产品纠结”的王振滔,与学不来波司登的奥康

文|螳螂观察 作者| 青月 曾经的一代“鞋王”奥康,正在走下神坛。 4月底,奥康国际披露了2022年的年报,数据显示,公司归母净利润亏损3.7亿元,同比下滑1185.93%。此外,公司年报还被出具了保留意见的审计报告…

Revit创建装饰纹路柱及CAD生成柱

一、Revit中如何创建装饰纹路的柱子 在罗马柱的外观中,很少存在圆滑的柱身,在Revit中,可以用阵列的方式,更快的装饰柱子。 在族样板中,采用拉伸的方式先创建一个柱子 采用空心拉伸为柱子绘制花纹 选择圆形工具绘制&…

C语言的数据类型

数据类型 变量和常量 常量的2种定义方式: 1、关键字const const 数据类型 常量名 值; 如:const float pi 3.14159; 2、宏定义 #define 常量名 值 PS: 这里没有"“和”;" 如:#define PI 3.14159 推荐用宏定义的方式定义常量。 整…

Thradlocal底层原理

java引用:强软弱虚 软引用空间不足时会被回收 软引用非常适合做缓存 弱引用:只要有垃圾回收,就会被回收 虚引用回不回收都拿不到 他只有一个作用,管理直接内存 也是只要有垃圾回收就会被回收 ThreadLocal Spring事务&#x…

【职场新人备忘录】新人职场生存指南:快速适应、持续成长和个人提升

新人职场生存指南:快速适应、持续成长和个人提升 引言 职场对于新人来说充满了新的挑战和机遇。作为一名新人,如何在职场中快速适应、获得成长和提升自己是至关重要的技能。本备忘录旨在为职场新人提供实用的职场tips,帮助他们在职场中取得…

Ubuntu 20.04 安装 mysql 并配置远程访问

文章目录 一、使用 apt-get 安装 mysql 服务二、初始化 mysql 数据库管理员用户密码三、配置远程访问 一、使用 apt-get 安装 mysql 服务 # 更新软件源 apt-get install update# 安装mysql服务 apt-get install mysql-server# 使用mysqladmin工具查看mysql版本 mysqladmin --v…

Set和Map学习笔记

参考链接:https://blog.csdn.net/weixin_43359799/article/details/123131917 Set 集合,存储的是value值,以对象形式存储,并且不会存储重复的值,可以用来数组去重。 const s new Set() [1, 2, 3, 4, 3, 2, 1].forEach(x > s.add(x)) c…

景区户外剧本杀小程序冲关软件

景区户外剧本杀小程序具有以下几个方面的市场前景: 旅游市场需求增加:随着人们对于旅游方式的多样化需求增加,景区户外剧本杀作为一种互动性强、参与感强的旅游体验项目,将会得到越来越多游客的喜爱和关注。 移动互联网应…

对称加密和非对称加密的区别

两个人有不想让第三者知道的事情,可以找一个私密的空间去聊。而互联网本身是一个开放的体系,双方在交换数据的时候会经历大量的第三者——公司的防火墙、ISP 的路由器,还有可能有黑客抓取数据。那么这个时候如果张三和李四有私密的话想聊&…

游戏是怎么做推广的

游戏是怎么做推广的 大家好我是艾西,今天是我们的闲聊日记,大家都知道我是一直做游戏相关的事情,不管是开发、运营还是资源渠道等都是不可少的因素,那么在这长时间的积累下还是有一些直接的心得以及方式方法的。今天我们主要聊的…

企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

java计算机二级部分知识点

参考来源 java计算机二级内容总结 百度图片 C/C版数据结构之树<一> 线性结构 如果一个数据满足下面两个条件&#xff1a;1&#xff09;有且只有一个根节点&#xff1b;2&#xff09;每一个节点最多有一个前件&#xff0c;也最多有一个后件&#xff0c;则称该数据为线性…

图神经网络入门:理论与实践

图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一种针对图数据进行建模和处理的深度学习模型&#xff0c;其具有在推理和预测具有高度关联和复杂结构的数据中具有优势等特点。与传统的神经网络不同&#xff0c;GNNs 能够自适应地根据图结构进行信…

I/O通道

一、设备控制器&#xff08;I/O接口&#xff09;&#xff1a; 功能&#xff1a;控制一个或多个I/O设备&#xff0c;以实现I/O设备和计算机之间的数据交换。是CPU与I/O设备之间的接口&#xff0c;接收从CPU发来的命令&#xff0c;去控制I/O设备工作&#xff0c;使CPU能够从繁杂…

【零基础学web前端】初识html,html结构,html常见标签,图片标签,超链接标签

前言: 大家好,我是良辰丫,今天我们就开始进入前端知识的学习&#x1f49e;&#x1f49e; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&#xff1a;零基础学web前端 &#x1f34e;励志语句&#xff1a;生活也许会让我们遍体鳞伤&#xff0c;但最终这些伤…