Python数据结构之dict底层细究

作为一个易用好使的数据结构 — 字典,与 Java 中 HashMap 一样,充满着设计的哲学。
下面我们就来详细讲述一下 dict 数据结构的底层原理

一、dict 构造约束
  1. dict是由 key 和 value 组成的。
  2. 其中 key 规定不能重复。如果字典键重复赋值的话,默认会取最后的赋值。
  3. 键必须是可哈希的。大多数Python对象可以作为键,但它们必须是可哈希的对象。像列表和字典这样的可变类型,由于它们不是可哈希的,所以不能作答为键。所有不可变的类型都是可哈希的,因此它们都可以做为字典的键。
二、dict 底层数据结构
2.1 数据结构

dict 底层数据结构就是一个哈希表。默认初始容量为8,负载因子为 2 / 3 2/3 2/3
Python数据结构之dict底层细究_第1张图片

2.2 插入方法

先根据hash函数计算插入元素的hash值,看是否发生冲突,如果没有发生冲突,则直接插入,否则,当发生冲突时,不断寻找周围是否有空的 bucket,当发现空的bucket时,将其放入(开放寻址法)。

有三种方法可用于开发寻址法

  • 线性探测
  • 二次探测
  • 双重探测
    Python数据结构之dict底层细究_第2张图片
2.3 查找元素

通过hash函数求出元素对应的hash值,对比对应位置的元素是否与我们要查找的元素相同,相同则已找到,停止查找。否则就顺序向后不断查找,如果还没有查找到该元素,就说明没有在该dict中。

2.4 删除元素

删除过程不能直接删除元素,可以将删除的标记为被删除。当进行元素查找时,遇到被设为标记的位置,不停下来,而是继续向下探测下去。

不直接删除的原因是:当直接删除时,在下一次查找时,通过现性探测法,找到空闲位置,我们可以认为 dict 中不存在这个元素,倘若这个空闲位置是我们后来删除了的,就会引发查找的问题,当设一个标记之后,检测到这个位置的标记,就会继续查找下去,直到查到元素,否则,就是 dict 中没有该元素。

三、dict 扩容

dict 默认初始容量为8,扩容时候要求是2的指数次方,负载因子 2 / 3 2/3 2/3,当空间使用量超过了负载因子时,需要进行扩容,否则后续发生冲突的概率就很大。

你可能感兴趣的:(Python,python,哈希表)