字典底層實現原理


字典是通過哈希表實現的。字典也被稱為哈希數組等。

字典 ---------------------哈希數組

鍵------(哈希函數)--數組索引

值-------------------------數組值

哈希函數的目的是使鍵均勻地分布在數組中,並且可以在內存中以O(1)的時間復雜度進行尋址,從而實現快速查找和修改。

哈希表中哈希函數的設計困難在於將數據均勻分布在哈希表中,從而盡量減少哈希碰撞和沖突。

(1)數據添加

key------》哈希函數--------》整型數字-----》數字對數組長度取余----》數組的索引

value----》在以該數字為下標的數組空間里。

(2)數據查詢

key------》哈希函數--------》整型數字-----》數字對數組長度取余----》數組的索引----》value

本質是多對一的映射,哈希碰撞是不可避免的,但是一個好的哈希函數的設計需要盡量避免哈希碰撞。


不可變數據類型:int,string,tuple  -->可哈希-->字典的key

可變數據類型:set,list,dict

常見的哈希碰撞解決方法:

(1)開放尋址法(open addressing)

當產生哈希沖突時,通過一個探測函數計算出下一個候選位置,如果下一個獲選位置還是有沖突,那么不斷通過探測函數往下找,直到找個一個空槽來存放待插入元素。

常見的開放地址思想的方法有線性探測再散列二次探測再散列

(2)再哈希法

按順序規定多個哈希函數,每次查詢的時候按順序調用哈希函數,調用到第一個為空的時候返回不存在,調用到此鍵的時候返回其值。

(3)鏈地址法

將所有關鍵字哈希值相同的記錄都存在同一線性鏈表中,這樣不需要占用其他的哈希地址,相同的哈希值在一條鏈表上,按順序遍歷就可以找到。

 (4)公共溢出區

一旦發生沖突,都填入溢出表。

(5)裝填因子α


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM