雜湊表 雜湊表 的實現原理

2021-10-14 03:59:48 字數 1710 閱讀 8456

雜湊表可以表述為,是一種可以根據關鍵字快速查詢資料的資料結構。

通常情況下,不論雜湊表中資料有多少,增加,刪除,改寫資料的複雜度平均都是o(1),效率非常高。

如果說每乙個資料它都對應著乙個固定的位置,那我們查詢特定乙個資料時,就可以直接檢視這個資料對應的位置是否存在資料。乙個形象的例子就是學生在教室中的位置,開學的時候,老師會給學生每乙個人分配乙個位置,而且不允許學生隨便亂坐位置,以後老師要檢視今天李剛同學有沒有上課,直接看李剛同學的位置是不是有人就可以判斷,沒必要點了全班同學的名才可以知道李剛同學來了沒有。

根據上面的原理,首先,我們要分配一片空間用來儲存我們資料,比如是乙個空的陣列

然後,有資料存進來的時候,按照特定規則得出這個資料在陣列中的位置,將資料存進這個位置。

我們就以存進乙個整型資料為例,特定規則就是取餘:

根據計算出來的值,將這些資料放入對應的位置,我們的陣列變為:

們已經把資料插入到了雜湊表中,現在,我們要查詢乙個資料,只要按照取餘規則計算出這個資料在陣列中對應的位置,然後檢視陣列的這個位置,就可以取出這個資料了,比如我們要從雜湊表中取出52,根據取餘規則,52的計算出來的位置是8,陣列中8這個位置是空的,52不在雜湊表中,找不到52的資料;從雜湊表中取出77,77計算出來的位置是0,陣列中0這個位置有值,而且值就是77,從雜湊表中取出77的值。

至此,我們知道實現了乙個很簡單的雜湊表的原理,其實還存在很多問題,這個我們接下來討論,這兒先把我們前面的一些概念用專業的術語替換一下,前面我們所說的特定規則,我們稱之為雜湊函式,用特定股則計算出來的值稱之為雜湊值。

以上例子存在哪些問題呢?

如何解決衝突(雜湊值相同)

有開放定址法,鏈定址法兩種解決方式。

開放定址法,就是將這個衝突的資料再重新計算乙個空的位置,將其存進去,比如我們要存放88,雜湊值是0,陣列這個位置已經有值了,那我們再獲取乙個雜湊值,比如在原雜湊值的基礎上加1,得到1,1的位置是空,我將88放進去。有人會問,1這個位置被佔了,那下乙個資料是1這個位置怎麼辦,這時候,我們還是同樣的做法,給這個資料再計算乙個雜湊值。

插入88後的陣列變為:

衝突解決了,但我們讀取資料的時候,好像又出現問題了,88的雜湊值是0,發現陣列0位置不是空的,那我們確定88在雜湊表中?肯定不行,0這個位置儲存的是77,不是88。我們的解決方法是判斷0這個位置的值是不是88,不是的話,再計算88的雜湊值是1,判斷是1這個位置是否為空,為空,則88不在雜湊表中;不為空,判斷值是否為88,若是88,確定在雜湊表中;如果值不是88,我們則繼續計算雜湊值是2,依次下去,直到找到88或者值為空的位置。

雜湊表如何擴容?

乙個簡單的解決辦法是,當插入資料時,發現所有的位置都滿了,我們就再分配乙個大於原先空間的一片空間,把原來空間中的值重新雜湊到新的空間中。

字典雜湊表的實現原理 字典雜湊表的實現原理

兩個陣列 bucket陣列 儲存key的hash桶,桶指的是把hashcode分配到一定的範圍內 entry陣列 用來儲存實現的值,它是乙個單向鍊錶,bucket總是儲存鍊錶的最後乙個元素 實現方式 通過雜湊桶來實現的k v儲存,通過key的hash碼,再進行桶計算,生成乙個在某個範圍內的值,這就是...

雜湊表(雜湊表)原理詳解

雜湊表 hash table,也叫雜湊表 是 根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做 雜湊函式 存放記錄的陣列叫做 雜湊表。或者 把任意長度的輸入 又叫做預對映,pre image 通過雜...

雜湊表(雜湊表)原理詳解

t什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜湊函...