python字典的底層原理

2021-10-16 10:49:38 字數 1358 閱讀 6571

無序,可變的容器資料結構,key-value資料儲存

key可以為數值,字串,元組,但是唯一,value則支援多種資料型別

讀取速度快,時間複雜度o(1

)o(1)

o(1)

python字典的底層實現是雜湊表,即帶有索引和儲存空間的表

如d={},建立乙個空字典,初始化乙個長度為8 的c陣列arr

1. 插入資料

d["name"]="jack"

首先對鍵- -「name」計算雜湊值,然後對當前c陣列arr的長度求餘,

得到乙個索引值,假如為5,則將當前的(雜湊值,鍵,值)作為乙個整體存入arr[5]

2.雜湊碰撞

當插入的鍵,經過雜湊計算,求餘後若得到與之前一樣的索引,比如5,

因此索引處已經存有資料,無法再次存入,那麼就將當前的索引+ 乙個偏移量,

重新計算索引位置,然後存入資料,這在python中為開放位址法

3. 擴容(可變)

當存入的資料超過總長度的2/3時,字典會成倍擴容,對舊資料根據新陣列長度計

算索引,重新存入

4.更新值

d["name"]="tom"

首先計算鍵- "name"的雜湊值,然後對當前陣列總長度求餘,得到索引,若索引

對應位置的資料的鍵==「name」,則更新它的值

5.刪除

del d["name"]

計算當前鍵- "name" 的雜湊值,求餘,找到索引,刪除資料,仍保持探測鏈,

標記此處有過資料

列表:遍歷所有資料,乙個乙個的比較,資料量大時,時間複雜度高

字典:對要查詢的鍵,計算雜湊值,求餘運算得到索引,一步到位,查詢效率高

雜湊碰撞

python字典–>開放位址法

redis–>單鏈法,在相應索引處,垂直引出乙個鍊錶節點,存入資料

擴容python字典use

dlen

gt

h>23

\frac > \frac

length

used

​>32

​,則成倍的擴容,然後對所有的舊資料,重新計算雜湊值,對新長度求餘數,得到索引,存入資料

redis雜湊,use

dlen

gt

h>

5\frac > 5

length

used

​>

5,則必定擴容,擴容為2

n2^n

2n,且此值必須第一次超出2∗u

se

d2*used

2∗used

,然後漸進式的rehash每個鍵值對,即每次訪問資料的時候,從新計算雜湊值,求餘,存入索引位置

089 字典的底層原理

字典也被稱為關聯陣列,還稱為雜湊陣列等。也就是說,字典也是乙個陣列,但陣列的索引是鍵經過雜湊函式處理後得到的雜湊值。雜湊函式的目的是使鍵均勻地分布在陣列中,並且可以在記憶體中以o 1 的時間複雜度進行定址,從而實現快速查詢和修改。雜湊表中雜湊函式的設計困難在於將資料均勻分布在雜湊表中,從而儘量減少雜...

Python字典的原理

python中dict物件是表明了其是乙個原始的python資料型別,按照鍵值對的方式儲存,其中文名字翻譯為字典,顧名思義其通過鍵名查詢對應的值會有很高的效率,時間複雜度在常數級別o 1 本文針對其實現的資料結構進行原理性說明和拓展,不涉及python的原始碼剖析。dict底層實現 在python2...

Python字典的實現原理

python中的字典底層依靠雜湊表 hash table 實現,使用開放定址法解決衝突,雜湊表是key value型別的資料結構,可以理解為乙個鍵值需要按照一定規則存放的陣列,而雜湊函式就是這個規則 字典本質上是乙個雜湊表 總有空白元素的陣列,python至少保證1 3的陣列是空的 字典中的每個鍵都...