热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python定义二维表结构_Python字典的内部实现:数据结构哈希表

散列表(哈希表、HashTable)是基本的数据结构之一,综合了数组和链表的优点,平均情况下,在查找、删除、插入操作上,都能

散列表(哈希表、Hash Table)是基本的数据结构之一,综合了数组和链表的优点,平均情况下,在查找、删除、插入操作上,都能实现O(1)的复杂度。本文介绍哈希表的内部基本原理:hash()函数的设计和冲突的解决;并简单介绍python内部dict的实现

hash()函数:将key映射为index

哈希表中内部有一块连续的内存区域,即数组,但与数组不同,哈希表通过 hash()函数将一个元素的key映射成该内部数组的索引,该key可以为字符串、整数、浮点数、或复杂的数据结构(比如Python的元组Tuple)。

e3f4f1e134303775c1e2d80d4fa8ac2a.png

hash例子

一个好的hash()函数的设计,需要满足均匀散列假设,即每个关键字都等概率的映射为内部数组中的任意一个索引。一个极端的设计反例,所有的关键字都映射为同一个索引,这种情况下或等价于链表(如果冲突通过链表解决),或等价于数组(如果冲突用数组实现),哈希表的优点就体现不出来。

最好一个元素的key的所有位(bit) 均参与hash()的生成, 如果用除法散列法,hash(x) = x % m, 一个不太接近2的整数幂的素数,通常是一个较好的选择。

冲突的解决方法

虽然我们可以通过精心设计散列函数来尽量减少冲突的概率,但冲突是不可避免的。解决冲突的常用方法有两类:一类是通过链接法(Chaining),一类是开放寻址法(Open Addressing)。

对于一个能存放n个元素的,具有m大小的内部数组的哈希表,定义装载因子 (Load factor)定义为a=n/m。

链接法中,冲突的元素都放在一个链表中,如果hash()设计好,链表会很短,性能也会很好。在简单均匀散列假设下,可以证明查找的复杂度为O(1+a)

另外一种方法,是开放寻址法,所有的元素存放在内部数组中,没有链表。插入一个元素,会不断尝试检查散列表,直到成功为止。映射函数 hash(key)会通过为hash(key, 0), hash(key, 1), …, hash(key, m-1)不断尝试,这个过程称为探查,最长的探查次数为m,这m次探查对应的索引为 0,1,…,m-1的一个排列。

可以证明,在简单均匀散列假设下,对于一次不成功的查找,复杂度为 O(1/(1-a)),对于一次成功的查找,为O(1/a log(1/(1-a))。a越大,性能越差,举例如下:

29ea6e9b9eaa06c8125aec2eec0f243f.png
python字典内部实现

python的字典类内部是通过Hash Table实现的,冲突解决方案为开放寻址法,需要说明的,内部的数组,会动态扩容以保证性能(看上图,通过降低装载因子,来提高性能),这也是为什么python中字典对象可以一直往里面插入元素的原因之一。具体实现详情可看cpython 的源码,对应dictobject.c文件。

可以通过插入时间的分析,来有个感性的感受。下图中的插入时间会有毛刺现象,毛刺的产生(即插入时间的突然变大),应该就是在内部的数组在扩容导致

d278eab82907d32ba0e561db47673058.png

散列表的插入时间源码

da5636598bb5685e26fb33009733c3ef.png

横坐标为索引;纵坐标为的插入时间

总结

散列表内部的原理主要是hash()函数的设计和冲突的解决,来达到O(1)的插、删、查的复杂度。Python字典的实现,就是散列表,内部通过扩容,保证性能和易用。明白上述观点,在以后的编程中对何时用dict会提高性能会了然于胸,比如最简单的两数之和。



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 开发笔记:超全的《 Django 入门教程 》上线了,居然还免费!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了超全的《Django入门教程》上线了,居然还免费!相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 前言无论使用哪种语言,我们都需要关注性能优化,提高执行效率。选择脚本语言需要持久的速度。在某种程度上,这句话说明了Python作为一种脚 ... [详细]
  • pandas的自带数据集_Pandas到底是个怎样的包?
    sh说明:本pandas非卧龙的pandas,而是Python众多科学计算包中的pandas。本次Pandas的简洁介绍,针对的是此包的新手࿰ ... [详细]
  • 在Python编程教程的这一部分中,我们通常讨论Python编程语言。我们展示了如何执行我们的第一 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
zhangpingzizai
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有