雜湊表(hash table,又叫雜湊表),其原理的核心就是雜湊函式(即雜湊函式),即如何構建乙個確定的對映,它能把關鍵字對映到乙個唯一的儲存位置,如下公式所示
記錄的儲存位置=f(關鍵字)
f為雜湊函式,又稱雜湊函式。通過此函式將值對映到表中的乙個位置來訪問記錄,以加快查詢的速度,存放記錄的陣列叫做雜湊表。
假設ki為某個物件的關鍵字,則用雜湊函式h(ki)來對映ki的記憶體位址,也就是ki的下標,將ki物件的元素內容存入這個位址中就行了。
用下面乙個通俗易懂的例子來解釋
現在需要儲存4個元素 13 7 14 11
顯然,我們可以用陣列來存。也就是:a[0]=13;a[1]=7;a[2]=14,a[3] = 11
我們也可以用hash表來儲存
先確定雜湊函式為h(ki)=ki%5;,因此
對於第乙個元素h(13)=13%5 = 3;也就是說13的下標為3;即hash[3]=13;
對於第二個元素h(7)=7%5=2;也就是說7的下標為2;即hash[7]=2
以此類推 hash[4]=14;hash[1]=11.
咋一看這樣並沒有什麼優勢,其實不然,實際上其在查詢方面效率很高
比如現在我要查詢11這個元素是否存在,如果用陣列,遍歷一遍,即需要查詢4次,時間複雜度為o(n)
而用雜湊函式來實現,代入上面的公式有
h(11) = 11%5=1,即查詢了1次,就找到了此值,時間複雜度為o(1)
優點:一對一的查詢效率很高;
所謂雜湊衝突即乙個關鍵字對映到多個值得情況,如
10%5=0;20%5=0,即hash[0]=10 還是 hash[0]=20呢
解決雜湊衝突常見的方法有拉鍊法,開放位址法,再雜湊法
拉鍊法即陣列和鍊錶的結合,如下圖所示:
左邊為乙個陣列,陣列中成員為乙個指標,指向乙個鍊錶的頭
比如要尋找353,首先找到陣列下標為1的位置,再找到值為1的鍊錶,此時由於(1不等於363),,繼續往下查詢下乙個鍊錶(337不等於353),再查詢下乙個鍊錶,即找到該值。
對於要插入儲存新的值,在衝突的時候,則將值存在該行鍊錶的最右邊.。
位桶:上述圖中每乙個陣列對應的所有鍊錶即在乙個位桶之中
雜湊桶:雜湊桶就是盛放不同key鍊錶的容器(即是雜湊表)
裝載因子:即儲存的關鍵字/雜湊表中可以雜湊的位置的大小,值越大表示hash表越擁擠,越容易引起衝突
優缺點
拉鍊法的優點在於處理衝突簡單,且由於用到了鍊錶,刪除方便。
缺點是表長不固定,需要額外的的空間。
開放位址法的特徵就是,每個位桶中沒有鍊錶,只會儲存乙個值,即每個位桶的裝載因子等於1。
如(1)線性探查法
(2)二次探查
di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 );這種方法的特點是:衝突發生時,在表的左右進行跳躍式探測,比較靈活。
(3)偽隨機探查
在查詢位置index周圍隨機的查詢。稱為隨機在探測。
di=偽隨機數序列;具體實現時,應建立乙個偽隨機數發生器,(如i=(i+p) % m),生成乙個偽隨機序列,並給定乙個隨機數做起點,每次去加上這個偽隨機數就可以了。
再雜湊法其實很簡單,就是在使用雜湊函式去雜湊乙個輸入的時候,輸出是同乙個位置就再次雜湊,直至不發生衝突位置
缺點:每次衝突都要重新雜湊,計算時間增加。
參考資料
雜湊表(雜湊表)原理詳解
雜湊表 hash table,也叫雜湊表 是 根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做 雜湊函式 存放記錄的陣列叫做 雜湊表。或者 把任意長度的輸入 又叫做預對映,pre image 通過雜...
雜湊表(雜湊表)原理詳解
t什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜湊函...
詳解雜湊表(雜湊表)原理
場景 在我們編寫基本的c語言 的時候,比如我們需要輸入乙個變數,然後對變數進行操作,最後返回乙個結果,那麼在我們對變數進行操作的時候,我們的編譯器就會對你的變數進行檢查,他會看你的變數是否定義 定義格式是否正確等。這裡就會存在查詢問題,如果我們採用二叉查詢樹等查詢樹來進行查詢的話會發現由於需要使樹保...