無序,可變的容器資料結構,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的陣列是空的 字典中的每個鍵都...