先來了解一下
hash
的基本思路:
設要儲存物件的個數為
num,
那麼我們就用
len個記憶體單元來儲存它們
(len>=num);
以每個物件
ki的關鍵字為自變數,用乙個函式
h(ki)
來對映出
ki的記憶體位址,也就是
ki的下標,將
ki物件的元素內容全部存入這個位址中就行了。這個就是
hash
的基本思路。
hash
為什麼這麼想呢?換言之,為什麼要用乙個函式來對映出它們的位址單元呢?
this is a good question.
明白了這個問題,
hash
不再是問題。下面我就通俗易懂地向你來解答一下這個問題。
現在我要儲存
4個元素
13 7 14 11
顯然,我們可以用陣列來存。也就是:
a[1] = 13; a[2] = 7; a[3] = 14; a[4] = 11;
當然,我們也可以用
hash
來存。下面給出乙個簡單的
hash
儲存:
先來確定那個函式。我們就用
h(ki) = ki%5;(
這個函式不用糾結,我們現在的目的是了解為什麼要有這麼乙個函式)。
對於第乙個元素
h(13) = 13%5 = 3;
也就是說
13的下標為3;即
hash[3] = 13;
對於第二個元素
h(7) = 7 % 5 = 2;
也就是說
7的下標為
2; 即
hash[2] = 7;
同理,hash[4] = 14; hash[1] = 11;
好了,存現在是存好了。但是,這並沒有體現出
hash
的妙處,也沒有回答剛才的問題。下面就來揭開它神秘的面紗吧。
現在我要你查詢
11這個元素是否存在。你會怎麼做呢?當然,對於陣列來說,那是相當的簡單,乙個
for迴圈就可以了。
也就是說我們要找4次。
下面我們來用
hash
找一下。
首先,我們將要找的元素
11代入剛才的函式中來對映出它所在的位址單元。也就是
h(11) = 11%5 = 1
了。下面我們來比較一下
hash[1]?=11,
這個問題就很簡單了。也就是說我們就找了
1次。這個就是
hash
的妙處了。至此,剛才的問題也就得到了解答。至此,你也就徹底的明白了
hash了。
至於hash
衝突的處理,這裡就不再講了。有一句俗話說得好:
「師傅領進門,修行靠個人
」,到這裡文章也就結束了。
通俗理解「雜湊表」
今天聊聊 雜湊表 雜湊表 主要作用在於高效查詢。在程式設計實現中,常常面臨著兩個問題 儲存和查詢,儲存和查詢的效率往往決定了整個程式的效率。腦補下,你在家裡忘記了指甲刀放在 通常要在你家所有抽屜中順序尋找,直到找到,最差情況下,有n個抽屜,你就要開啟n個抽屜。這種儲存方式叫陣列,查詢方法稱為 遍歷 ...
雜湊表的理解
因為在開發中經常用到hashmap,hashset等集合結構,但是一直對其中的hash的意思不太理解。今天抽空查了一下資料,順便記錄一下現在的理解。事先宣告一下,此文只介紹雜湊表的資料結構,不介紹具體的hash演算法 首先我們不要去想hash表是用來幹嘛的,先以實際問題著手。就是現在需要乙個能夠儲存...
理解雜湊表
雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...