哈希結構的python實現

哈希函數是哈希結構的重要組成部分,一個好的哈希函數可以提高查詢的效率。在python中有兩個數據結構是哈希結構實現的,分別是set集合和dict字典。

那麼這篇文章主要想帶大家實現一個簡單的字典的結構,也就是hashmap,這個數據結構是由一個個的鍵值對(k,v)組成。

假定k,v都是int的整數類型,哈希函數我們使用最經典的取模運算

對於哈希函數會存在key取模後值相同的這種情況,處理辦法就是我們採用python自帶的數據結構list來線性存儲值相同的value

注:由於我們要實現字典的功能,所以存儲key,value的數據結構需要我們自己來實現

實現hashmap的組件

對於hashmap這個數據結構,常用方法就是增刪改查,具體的實現方法就是對應get(),put(),delete()這個三個函數,我們假定哈希函數為key%1000,存儲kv鍵值對的數據結構如下:

[ [] for i in range(1000) ]

初始化一個包含有1000個空list的二維list,其中空的list中存放的就是含有鍵值對的對象

鍵值對的對象代碼如圖


哈希結構的python實現

這個對象需要具備獲取key的值(getKey()這個方法),更新key的值(setKey()這個方法),獲取value的值(getValue()這個方法),更新value的值(setValue()這個方法),在線性的list中存放的就是Dic這個對象,通過Dic這個對象來實現鍵值對的增刪改查

在基礎的元數據結構準備好之後,我們可以開始hashmap的接口(get,put,delete)的實現

  • put()方法


哈希結構的python實現

如圖,hashmap就是初始化好的二維list,通過k的哈希運算(self.mod)得出這個鍵值對存放的位置,如果bucket為空,說明這個list之前還沒有放入元素,那麼就可以就直接將生成的dic對象append到bucket中。如果bucket不為空,那麼我們就開始遍歷整個的bucket列表,如果k之前已經存在bucket中那麼就直接更新value的值,當bucket中存在-1的key值,那麼說明之前這個位置的dic已經被刪除,可以將新的dic覆蓋更新到已經刪除的這個位置上。如果bucket中沒有-1的key並且也沒有與dic的相等的key,這個時候就將dic直接append到bucket中就可以了

  • get()方法


哈希結構的python實現

對於get方法,同理先將獲取到的k進行哈希運算得到存放dic的位置,然後遍歷bucket,如果存在與k相等的key,通過getValue()返回獲取的值,如果遍歷完成也沒有與k相等的key,說明之前沒有存放這個k,返回-1

  • delete()方法


哈希結構的python實現

delete刪除方法的實現,本質上沒有將dic對象從list中移除,而是將dic的key值置為-1,這樣新的元素遇到刪除的位置可以直接覆蓋使用,沒有必要在遍歷到bucket的最後端去開闢一個新的內存空間存放dic元素


由於篇幅的原因,想看完整代碼的讀者可以諮詢作者,歡迎大家關注桓藝恆,一塊學習討論互聯網的技術


分享到:


相關文章: