Python數據結構之dict底層細究

作爲一個易用好使的數據結構 — 字典,與 Java 中 HashMap 一樣,充滿着設計的哲學。
下面我們就來詳細講述一下 dict 數據結構的底層原理

一、dict 構造約束
  1. dict是由 key 和 value 組成的。
  2. 其中 key 規定不能重複。如果字典鍵重複賦值的話,默認會取最後的賦值。
  3. 鍵必須是可哈希的。大多數Python對象可以作爲鍵,但它們必須是可哈希的對象。像列表和字典這樣的可變類型,由於它們不是可哈希的,所以不能作答爲鍵。所有不可變的類型都是可哈希的,因此它們都可以做爲字典的鍵。
二、dict 底層數據結構
2.1 數據結構

dict 底層數據結構就是一個哈希表。默認初始容量爲8,負載因子爲2/32/3
在這裏插入圖片描述

2.2 插入方法

先根據hash函數計算插入元素的hash值,看是否發生衝突,如果沒有發生衝突,則直接插入,否則,當發生衝突時,不斷尋找周圍是否有空的 bucket,當發現空的bucket時,將其放入(開放尋址法)。

有三種方法可用於開發尋址法

  • 線性探測
  • 二次探測
  • 雙重探測
    在這裏插入圖片描述
2.3 查找元素

通過hash函數求出元素對應的hash值,對比對應位置的元素是否與我們要查找的元素相同,相同則已找到,停止查找。否則就順序向後不斷查找,如果還沒有查找到該元素,就說明沒有在該dict中。

2.4 刪除元素

刪除過程不能直接刪除元素,可以將刪除的標記爲被刪除。當進行元素查找時,遇到被設爲標記的位置,不停下來,而是繼續向下探測下去。

不直接刪除的原因是:當直接刪除時,在下一次查找時,通過現性探測法,找到空閒位置,我們可以認爲 dict 中不存在這個元素,倘若這個空閒位置是我們後來刪除了的,就會引發查找的問題,當設一個標記之後,檢測到這個位置的標記,就會繼續查找下去,直到查到元素,否則,就是 dict 中沒有該元素。

三、dict 擴容

dict 默認初始容量爲8,擴容時候要求是2的指數次方,負載因子2/32/3,當空間使用量超過了負載因子時,需要進行擴容,否則後續發生衝突的概率就很大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章