当前位置:首页 > 科技  > 软件

Python 哈希表的实现——字典

来源: 责编: 时间:2023-11-28 09:37:23 370观看
导读哈喽大家好,我是咸鱼接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构在 Python 中,字典的键(key)被哈希,哈希值决定了键对

哈喽大家好,我是咸鱼Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在 Python 中,字典的键(key)被哈希,哈希值决定了键对应的值(value)在字典底层数据存储中的位置Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

那么今天我们就来看看哈希表的原理以及如何实现一个简易版的 Python 哈希表Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

ps:文中提到的 Python 指的是 CPyhton 实现Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

何为哈希表(hash table)

Vf928资讯网——每日最新资讯28at.com

哈希表(hash table)通常是基于“键-值对”存储数据的数据结构Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

哈希表的键(key)通过哈希函数转换为哈希值(hash value),这个哈希值决定了数据在数组中的位置。这种设计使得数据检索变得非常快Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

举个例子,下面有一组键值对数据,其中歌手姓名是 key,歌名是 valueVf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

如果我们想要将这些键值对存储在哈希表中,首先需要将键的值转换成哈希表的数组的索引,这时候就需要用到哈希函数了Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

哈希函数是哈希表实现的主要关键,它能够处理键然后返回存放数据的哈希表中对应的索引Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

一个好的哈希函数能够在数组中均匀地分布键,尽量避免哈希冲突(两个键返回了相同的索引)Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

哈希函数是如何处理键的,这里我们创建一个简易的哈希函数来模拟一下(实际上哈希函数要比这复杂得多)Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

这个简易版哈希函数将歌手名(即 key)首字母的 ASCII 值与哈希表大小取余,得出来的值就是歌名(value)在哈希表中的索引Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

那这个简易版哈希函数有什么问题呢?聪明的你一眼就看出来了:容易出现碰撞。因为不同的键的首字母有可能是一样的,就意味着返回的索引也是一样的Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

例如我们假设哈希表的大小为 10 ,我们以上面的歌手名作为键然后执行 simple_hash(key, 10) 得到索引Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

可以看到,由于Juice WRLD 和 J.cole 的首字母都一样,哈希函数返回了相同的索引,这里就发生了哈希碰撞Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

虽然几乎不可能完全避免任何大量数据的碰撞,但一个好的哈希函数加上一个适当大小的哈希表将减少碰撞的机会Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

当出现哈希碰撞时,可以使用不同的方法(例如开放寻址法)来解决碰撞Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

应该设计健壮的哈希函数来尽量避免哈希碰撞Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

我们再来看其他的键,Kanye 通过 simple_hash()  函数返回 index 5,这意味着我们可以在索引 5 (哈希表的第六个元素)上找到 其键 Kanye 和值Come to lifeVf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

哈希表优点

在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置,使得检索、插入和删除操作具有常数时间复杂度 O(1) 的性能Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

与其他数据结构相比,哈希表因其效率而脱颖而出Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

不但如此,哈希表可以存储不同类型的键值对,还可以动态调整自身大小Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

Python 中的哈希表实现Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在 Python 中有一个内置的数据结构,它实现了哈希表的功能,称为字典Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

Python 字典(dictionary,dict)是一种无序的、可变的集合(collections),它的元素以 “键值对(key-value)”的形式存储Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

字典中的 key 是唯一且不可变的,这意味着它们一旦设置就无法更改Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在底层,Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

所以当你想要检索值时,Python 就会对键进行哈希,从而快速引导 Python 找到值的存储位置,而无需考虑字典的大小Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

可以看到,我们通过方括号[key]来访问键对应的值,如果键不存在,则会报错Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

为了避免该报错,我们可以使用字典内置的 get() 方法,如果键不存在则返回默认值Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在 Python 中实现哈希表Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

首先我们定义一个 HashTable 类,表示一个哈希表数据结构Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在构造函数 __init__() 中:Vf928资讯网——每日最新资讯28at.com

  • size 表示哈希表的大小
  • table是一个长度为 size 的数组,被用作哈希表的存储结构。初始化时,数组的所有元素都被设为 None,表示哈希表初始时不含任何数据

Vf928资讯网——每日最新资讯28at.com

在内部函数 _hash() 中,用于计算给定 key 的哈希值。它采用给定键 key 的第一个字符的 ASCII 值,并使用取余运算 % 将其映射到哈希表的索引范围内,以便确定键在哈希表中的存储位置。Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

然后我们接着在 HashTable 类中添加对键值对的增删查方法Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

其中,set() 方法将键值对添加到表中,而 get() 该方法则通过其键检索值。该 remove() 方法从哈希表中删除键值对Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

现在,我们可以创建一个哈希表并使用它来存储和检索数据:Vf928资讯网——每日最新资讯28at.com

图片图片Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

前面我们提到过,哈希碰撞是使用哈希表时不可避免的一部分,既然 Python 字典是哈希表的实现,所以也需要相应的方法来处理哈希碰撞Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

在 Python 的哈希表实现中,为了避免哈希冲突,通常会使用开放寻址法的变体之一,称为“线性探测”(Linear Probing)Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

当在字典中发生哈希冲突时,Python 会使用线性探测,即从哈希冲突的位置开始,依次往后查找下一个可用的插槽(空槽),直到找到一个空的插槽来存储要插入的键值对。Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

这种方法简单直接,可以减少哈希冲突的次数。但是,它可能会导致“聚集”(Clustering)问题,即一旦哈希表中形成了一片连续的已被占用的位置,新元素可能会被迫放入这片区域,导致哈希表性能下降Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

为了缓解聚集问题,假若当哈希表中存放的键值对超过哈希表长度的三分之二时(即装载率超过66%时),哈希表会自动扩容Vf928资讯网——每日最新资讯28at.com

Vf928资讯网——每日最新资讯28at.com

最后总结一下:Vf928资讯网——每日最新资讯28at.com

  • 在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置
  • Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中
  • Python 通常会使用线性探测法来解决哈希冲突问题

本文链接:http://www.28at.com/showinfo-26-34685-0.htmlPython 哈希表的实现——字典

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十个杀手级VS Code插件

下一篇: PHP 8.3 正式发布!

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为“On
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top