python字典的实现原理

最近刷算法题时经常要在某个列表中查询某个值。在列表中查询值的时间复杂度高,因此采用字典来代替查询过程。字典的查询、删除、插入平均时间复杂度都是O(1)。

1、字典是通过哈希算法实现的,字典的key可以是str,int,tuple等不可变对象,不能是列表(可变,不可哈希);

2、python3.7之前字典是无序的;

3、字典的实现过程(python3.7之后):

3.1 哈希表和indices:

indices = [None, None, index, None, index, None, index]
entries = [
    [hash0, key0, value0],
    [hash1, key1, value1],
    [hash2, key2, value2]
]

3.2、hash(key)后得到的值与len(entries)-1做‘与’操作得到index(哈希出来的值通常很大,所以做‘与’操作)

3.3、indices中找到index对应的值,此时indices中存储的是key在entries的位置(len(entries))

3.4、解决冲突:python的哈希一般保证indices辅助表间隔取值【None,index,None,index】,使得冲突时能很快找到下一个值。

4、为什么新字典是有序的?

新字典的entries不再是稀疏的,而是由indices维护具体的位置,所以插入的值是有序的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字典Python中非常重要的数据结构之一,它的核心原理是散列表(hash table)。散列表是一种通过键来直接访问值的数据结构,它能够在平均情况下以常数时间复杂度O(1)进行查找、插入和删除操作。 散列表由一系列的桶(bucket)组成,每个桶中存储着键值对(key-value pair)。当我们向字典中插入一个键值对时,Python会根据键的哈希值(hash value)计算出该键对应的桶的索引。哈希值是根据键的特征计算出来的一个唯一的整数,它可以将任意长度的键映射到固定长度的索引。 在散列表中,每个桶都有一个固定的索引,因此可以通过索引直接访问到对应的桶。当我们需要查找一个键时,Python会根据键的哈希值找到对应的桶,然后再在桶中查找键对应的值。这个过程非常高效,因为无论字典中有多少个键值对,查找的时间复杂度都是O(1)。 然而,由于哈希函数的特性,不同的键可能会产生相同的哈希值,这就是所谓的哈希冲突(hash collision)。为了解决哈希冲突,Python使用了开放寻址法和链表法两种方法。开放寻址法是将冲突的键值对存放在其他的桶中,而链表法是将冲突的键值对存放在同一个桶中的链表中。 总结一下,Python字典的核心原理是散列表,它通过哈希函数将键映射到固定长度的索引,然后使用开放寻址法或链表法解决哈希冲突,实现高效的键值对查找、插入和删除操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值