簡單理解散列表

我們知道,散列表查詢的時間複雜度爲O(1),比起無序數組的O(n)和有序數組的O(logn)速度要快太多。在很多語言框架中已經幫我們封裝好了散列表,比如java的Map、C#的Dictionary等。散列表也有其它叫法,比如字典、映射等。它主要是key-value結構,下面我們就看下散列表是怎麼實現查詢的O(1)。
散列表最主要的是對key進行散列運算,所以需要一個計算散列的函數。我們先制定一個規則,比如:
a=1
b=2
c=3
d=4
e=5
f=6
然後散列值等於每個字符的乘積之和。比如key=bad,則計算出的散列值就等於 2*1*4=8 。散列規則可以由你自由定義,但儘量保證能平均分佈,減少出現相同散列值。
我們來看一個例子,假如存儲下面這個javascript散列表:
var maps = {'bad':'evil','cab':'poll','dab':'jack'};
程序先爲maps對象開闢內存空間,比如內存中連續的十個格子(內存地址),如下圖:


先存入bad,對其進行散列運算: 2*1*4=8 ,然後我們將value值放到第八個格子裏,如下圖:


接着再存入cab,對其進行散列運算: 3*1*2=6 ,然後我們將value值放到第六個格子裏,如下圖:


最後存入dab,對其進行散列運算: 4*1*2=8 ,然後我們將value值放到第八個格子裏。不過這時,第八個格子已經有值了,這裏發生了散列值衝突。這時我們該怎麼處理呢?可以將小格子裏的值改爲存放一個數組,即將兩個鍵值對放入一個格子裏,如下圖:


以上我們就完成了一個散列表的存儲,其中最主要就是對key進行散列計算。散列表可以實現查詢、插入、刪除的時間複雜度爲O(1)。性能上要比無序數組(O(n))、有序數組(O(logn))等高出太多。

本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章