【无标题】



weixin_39818014

关注

python字典长度可变吗_Python字典dict实现原理

一. 什么是字典?

 

字典是一系列由键(key)和值(value)配对组成的元素的集合。字典是一个可变容器模型,可以存储任意类型对象。字典实现与哈希算法密不可分(不同的Python版本,算法会不同),不了解哈希算法的童鞋可以先去了解相关知识。

 

二. 字典是否是有序的?

 

在Python3.6之前,字典是无序的,但是Python3.7+,字典是有序的。在3.6中,字典有序是一个implementation detail,在3.7才正式成为语言特性,因此3.6中无法确保100%有序。

 

三. 字典的查询、添加、删除的时间复杂度?

 

字典的查询、添加、删除的平均时间复杂度都是O(1)(为什么是平均时间复杂度,文章后面会讲解到),相比列表与元祖,性能更优。

 

四. 字典的实现原理?首先说说Python3.6之前的无序字典

 

字典底层是维护一张哈希表(见下图),我们可以把哈希表看成一个列表,哈希表中的每一个元素又存储了哈希值(hash)、键(key)、值(value)3个元素。(Python3.6之前)

 

enteies = [

 

['--', '--', '--'],

 

[hash, key, value],

 

['--', '--', '--'],

 

['--', '--', '--'],

 

[hash, key, value],

 

]

 

由上可以见哈希表的存储结构,我们也可以看出,元素之间有一些空元素,我们通过增加一个元素来讲解具体实现。计算key的hash值【hash(key)】,再和mask做与操作【mask=字典最小长度(DictMinSize) - 1】,运算后会得到一个数字【index】,这个index就是要插入的enteies哈希表中的下标位置

 

若index下标位置已经被占用,则会判断enteies的key是否与要插入的key是否相等

 

如果key相等就表示key已存在,则更新value值

 

如果key不相等,就表示hash冲突,则会继续向下寻找空位置,一直到找到剩余空位为止。

 

以上介绍了老字典的实现过程,下面我们带入具体的数值来介绍。

在许多情况下,需要比较多个列表,获取它们有或没有交集、差集等等,在 Javascript 有一个数据类型可以很好的实现这些需求,那就是 Set 。

Set对象就像一个数组,但是仅包含唯一项。Set对象是值的集合,可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

什么是 Set

Set 对象是值的集合,可以按照插入的顺序迭代它的元素,元素只会出现一次,即 Set 是不按特定顺序存储的且值唯一的集合。与堆栈、队列和数组等其他集合类型不同,Set 可用于列表比较,并用于检测集合中是否存在某个项。

Set 是一种抽象数据类型,它是由其行为定义的,类似堆栈和队列数据结构。

Javascript Set

Javascript 中的 Set 是非常基础和简单的,它不像其他语言那样提供通用的集操作功能。它使用了一种独特的算法(不是基于严格的相等 === )来检测元素是否相同。

这意味着在集合中存储 undefinednull 和 NaN 将只会存储一次,即使是 NaN !== NaN ,它通常应用于对象类型的存储。

 

const setTest = new Set([0, -0, Infinity,null, undefined, null, NaN, NaN, Infinity,null]);
console.log(setTest);  // Set { 0, Infinity, null, undefined, NaN }

从上面的执行结果可以得出以下结论:

  • 虽然 NaN 和 NaN 不相等,但是在 Set 集合里面只会存在一个
  • undefined 和 Infinity 在 Set 集合里面只会存在一

什么时候使用 Set

当需要对特定列表执行比较和判断是否相等时,可以使用 Set,下面大家描述一下适用的场合,主要就是数据里的集合操作:

  • 获取两个集合的并集 union
  • 获取两个集合的差集 difference
  • 获取两个集合的交集 intersection
  • 获取两个集合的对称差集 intersectionDifference
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值