HashTable 雜湊 雜湊表 面試基礎

2021-10-04 20:19:08 字數 1409 閱讀 7715

4. 擴充再雜湊rehash

雜湊表也叫雜湊表,用於儲存key-value鍵值對,通過將key對映到表中的乙個位置來以常數的時間實現插入、刪除和查詢的技術。

使用雜湊/雜湊函式將要查詢的鍵值轉化為陣列的索引,在理想狀態下,不同的鍵對應不同的索引,如果每個鍵對應的索引都不同的話,其實就是直接用陣列儲存。但如果key的範圍很大的話,需要的陣列太大(比如處理海量資料時的bithash),記憶體消耗上不划算。一般來說,為了折中,用小於鍵範圍的陣列(容量為tablesize)來儲存。此時,不同的鍵就會對應相同的索引,這個時候,需要解決雜湊衝突的問題。

對於整數來說,最簡單的雜湊函式就是 key mod tablesize,這個時候,保證table的大小為素數時,該雜湊函式能夠對隨機整數實現平均分配。

下面是一些在應用領域較為出名的雜湊演算法:

3.1 分離鏈結法(拉鍊法)

拉鍊法可用於避免雜湊衝突,它的思想是把hash相同的元素存放在鍊錶中,將陣列和鍊錶結合起來,平衡時間和空間,實現快速的查詢插入和刪除。

即,將陣列中的每個元素指向乙個鍊錶,鍊錶中的每乙個節點都儲存索引相同的鍵值對。拉鍊法的陣列長度要足夠大,使得鍊錶盡量小,以保證查詢效率。

可以指定雜湊表的最大裝載因子 load factor,一旦超過就會rehashing。

load factor = 雜湊表中的元素個數與雜湊陣列大小的比值。

一般設定為1,即所有儲存的元素個數大於陣列大小時,就rehashing。

3.2 線性探測法

與拉鍊法不同的是,該方法在檢測到雜湊衝突時,不拉出乙個鍊錶進行儲存,而是逐個探測找出後序的空單元來解決衝突,如下圖所示,插入sandra dee時,因為152已被john smith佔據,故放置於153,同理,插入ted baker時,雖然hash值為153,但因為被佔據,就順序放到154。

3.3 平方探測法

為了解決線性探測法中一次聚集問題的衝突解決辦法。平方探測就是先探測後序的第1個,如果被占用,則探測後序的第22=

42^2=4

22=4

個,如果還被占用,探測後序的第9個。

裝填因子一般低於0.5,即確保雜湊表大小至少是表中元素的兩倍大,這樣平方探測解法總可以實現。

3.4 雙雜湊

最後乙個解決衝突的辦法是雙雜湊,在計算探測位置時應用第二個雜湊函式。當鍵為字串時,由於雜湊函式的計算比較耗時,通常使用簡單易行的平方探測法。

如果雜湊表中的元素太多,超過設定的裝填因子,那麼操作的執行時間開始過長,此時進行rehash,建立乙個新錶(一般是原表大小兩倍後的第乙個素數),使用新的雜湊函式掃瞄原表,將元素複製到新表裡。

hash table 雜湊表(雜湊表)

hash table 也叫雜湊表。涉及到雜湊函式 雜湊衝突處理的問題。雜湊函式是雜湊表的關鍵,是用來從值到雜湊表索引 存放位置 的對映。比如 要存放乙個學校學生的姓名,他們是amanda,jack,andy,tom,bob,black等等500個人。我們可以設計乙個雜湊表,容量為500,來存放這些學...

HashTable 雜湊表(雜湊表)

雜湊表 雜湊表 是根據關鍵字 key 而訪問在記憶體位置的資料結構。其方法是 它通過乙個關鍵值的函式將所需的資料對映到表中的位置來訪問資料,這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表 雜湊表 構造雜湊表的幾種方法 直接定址法 取關鍵字的某個線性函式為雜湊位址,hash key key 或 h...

雜湊表(雜湊)HashTable實現

近期刷leetcode發現凡是找字串中反覆字元或者陣列中找反覆資料的時候就不知道從何下手了。所以決定學習一下雜湊表解題。雜湊表的原理主要是解決分類問題,hash表是介於鍊錶和二叉樹之間的一種中間結構。鍊錶使用十分方便,可是資料查詢十分麻煩 二叉樹中的資料嚴格有序,可是這是以多乙個指標作為代價的結果。...