雜湊表的簡單理解

2021-10-06 12:42:35 字數 1032 閱讀 7698

雜湊表具有查詢速度快,效率高的優點,是基於陣列,特定情況下結合鍊錶(紅黑樹)的資料結構。

設計思路:

設想用陣列儲存英文本母a-zzzzzzzz的字串,這樣的話總共有26^8種結果,而如果想要查詢字母absdaw就只能通過遍歷陣列,非常影響速度。

靈感一閃而過,如果能把每個字母與陣列下標繫結不就能快速查詢,而每個字元都有乙個唯一特定的ascii值

思路1:提取字母的每個字元,轉為ascii值後相加

public

intwordtonum

(string word)

return total;

}

問題:很容易發現不同的字母往往對應同乙個下標

思路2:為解決重複性問題,不在每個字元ascii值直接相加,而是加冪次方

public

intwordtonum

(string word)

return total;

}

問題:陣列會變得非常巨大,甚至已經超過陣列允許的上限(int範圍)

解決方法:通過取餘壓縮陣列容量(取餘的最大值為 volume-1)

return total % volume
壓縮容量後還是有可能出現不同字母對應同乙個下標(概率小)

後人們提出兩種處理方法:

1.開放位址法

1.1 線性探測:如果發現改下標下的空間已被佔,就往後探測乙個空間,直到有空位(容易產生聚集效應:大量資料集中在乙個區域)

1.2 二次探測:以1,4,9…的步長向後探測,直到有空位(容易越陣列邊界和小聚集)

1.3 再雜湊:以計算的hash值在hash,直到有空位(計算複雜)

2.鍊錶法:

簡單解釋:即在重複的下標下掛乙個鍊錶,用於存放該下標剩餘的值

注:1.7的hashmap底層就是加鍊表,乙個下標如果掛的鍊錶超過閾值,就對陣列擴容以減少鍊錶

1.8的hashmap底層是加紅黑樹,乙個下標如果要掛的鍊錶超過閾值,就生成紅黑樹代替鍊錶

雜湊表的簡單理解

我們要在陣列或者煉表裡查詢乙個指定得資料,唯一能做得事情就是遍歷的去查詢,這樣的時間複雜度是o n 那有沒有一種方法可以以o 1 的時間複雜度找到這個資料呢?現在來想這個乙個問題,現實生活中我們的衣物都是分類存放的,放的時候根據是什麼種類的衣物放到指定的地方,取的時候依照要取的衣物種類去指定的地方找...

雜湊表的理解

因為在開發中經常用到hashmap,hashset等集合結構,但是一直對其中的hash的意思不太理解。今天抽空查了一下資料,順便記錄一下現在的理解。事先宣告一下,此文只介紹雜湊表的資料結構,不介紹具體的hash演算法 首先我們不要去想hash表是用來幹嘛的,先以實際問題著手。就是現在需要乙個能夠儲存...

理解雜湊表

雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...