【python】数据结构与算法—哈希表
一、哈希表
用順序表來存數據
存鍵值對時,通過哈希函數計算出鍵對應的索引,將值存到索引對應的數據區中
獲取數據時,通過哈希函數計算出鍵對應的索引,將該索引對應的數據取出來
二、哈希沖突
對于任何哈希函數,都會出現兩個不同的元素映射到同一個位置上的情況,這種情況稱為哈希沖突
三、開鏈法
哈希表的每一個位置都連接一個鏈表,當發生沖突時,沖突的元素會被加到該位置的鏈表的最后
1、開鏈法存儲數據
四、開放尋址法
如果哈希函數得到的位置i已經又數據了,那么就往后探查新的位置來存儲這個值
線性探測:如果i有數據了,則探測i+1,i+2…以此類推,直到找到空的位置
1、存儲值的過程
a、key=apple,cat,dog,hello,通過哈希函數映射之后得到的值都為2
b、現有一個字典dic={‘apple’:1,‘cat’:2,‘dog’:3},存儲數據,
c、原索引為2的位置沒有存儲數據,此時將apple的值1存儲到這個
d、接著cat尋址到索引為2的位置,發現這個位置已經有值了,會繼續往后探測,依次類推
2、獲取值的過程
a、獲取dic[‘dog’]的時候,先到索引為2的位置去獲取
b、獲取不到繼續向后探測
3、刪除值得過程
dic.remove(‘cat’)
a、給每一個節點定義一個狀態
未使用
已使用
已刪除
二次探測:如果位置i被占用,則探測i+1^2,i+2^2…一次類推,知道找到空的位置
五、開鏈法和開放尋址法的區別
開鏈法:
優點:刪除節點比較容易,數據量比較大使用開鏈法
缺點:使用空間比較大
開放尋址法:
刪除節點不能真正的把節點刪掉,給每一個節點定義一個狀態,數據量比較小使用開放尋址法
缺點:
a、使用開放尋址法,那么順序表總歸會有一天會填滿
b、一般為了保證插入和查找的效率,哈希表一般在元素數量在容量的2/3時,就會進行擴容
c、擴容之后,計算的哈希函數也會隨之變化,那么里面的數據存儲的順序也會變化
總結
以上是生活随笔為你收集整理的【python】数据结构与算法—哈希表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python】队列——用顺序表实现队列
- 下一篇: 【python】数据结构与算法—双端队列