雜湊表的學習筆記

2021-07-10 13:20:06 字數 1559 閱讀 9135

昨天晚上,被一道leetcode上名叫palindrome pairs困擾了很久,導致沒時間寫點什麼。

堅持,不管學的多少,爭取每天進步一點,記錄一點。

今天用到了c++stl的map容器,了解到map容器內部儲存是用紅黑樹,可以使查詢訪問map中元素的時間從線性結構的o(n)減少到o(logn)。

關於紅黑樹之前了解較少,今天學習了一部分知識,但還沒完全領悟,下次再仔細總結。

----------以上都是廢話。。忽略。。。

從o(n)到o(logn),樹結構讓資料查詢更快捷,但樹的構造和維護也犧牲了時間,但對於頻繁訪問的資料,這點犧牲是值得的。

樹形結構儲存不是查詢資料最快的。

最快的是雜湊表儲存。

雜湊表,簡單來說,就是把要儲存的資料的關鍵字,通過乙個函式對映到對應的有限、連續的記憶體單元中儲存。

舉個例子來說:

有資料:char  s[5]=

將每個元素通過 h(x)=(x-『a』)%5  對映到0,1,2,3,4的記憶體單元中。

當你要查詢『d』在不在你的s陣列裡時:

只需計算h( 『d' )位址4,看這塊位址是否有』d『。

有了雜湊表,就比直接遍歷s陣列快多了。

而這只是理想的運氣好的情況。應為會有衝突---------

假設s陣列是這樣 char  s[6]=,

h(x)不變:h(x)=(x-『a』)%5 ,

那麼當存入』f『時會發現h('f')=0,而0記憶體單元已經被』a『佔據了。

這就是發生了衝突。

理論上講雜湊表的衝突是不可避免的,但要儘量減少衝突。

當衝突發生了想辦法解決衝突。

減少衝突最直接的方法就是,選好用什麼雜湊函式。

常見的雜湊函式構造:

1.直接定值:

h(x)=x或者h(x)=a*x+b

這種方法就直接把資料的關鍵字一對一對映,若沒有重複關鍵字,就沒有衝突。

當資料很少,數量有限時適用,但在解決實際問題中用得少。

2.數字分析:

選取數字序列的某幾位作為位址。

例如若有下6個資料:

就可以選第3、4位(一定對映後)作為位址,會比選其他1/2/5/6/7位做位址的衝突少。

3.平方取中:

將資料的關鍵字平方取中間幾位作為位址,這種方法常見。這樣能使位址有更高隨機性。具體取幾位要看雜湊表表長。

4.摺疊法:

也是常見方法之一。

將資料的關鍵字摺疊:

如有這樣乙個關鍵字:12345678

摺疊為兩位:(s形摺疊)

+ 78

摺疊為四位:(c形摺疊)

1234   

+ 8765

5.取餘法:

最簡單、最常用的方法。可以配合平方取中和摺疊一起使用。

h(x)=x%d

d取值非常重要!這個方法的好壞就取決於d。

常見的d取質數或者 不包含小於20質因數的合數。

6.隨機數生成:

用乙個隨機函式,取關鍵字的隨機函式值作為位址。

適用於關鍵字位數或者形式不同的情況。

而解決衝突的發放也有幾種。(電腦沒電了,下次繼續)

學習筆記 雜湊表

最近開始把之前欠的noip基礎知識點刷一下 2333其實我的作業還沒有寫完 做到雜湊表的時候,我有點懵,顯然前幾次講課的時候我沒有聽 於是lbmttw lx就開始在網上學習了 啊啊啊 沙雕橘貓真心可愛,愛了愛了 發現其實hash表是個比較有趣的東西 一種典型的空間換時間的資料結構,也叫雜湊表 時間複...

雜湊表與雜湊演算法學習筆記

雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...

學習雜湊表

雜貨店商品對應的 舉例 簡單查詢就是拿出商品價目本,這個價目本並不是有序的,顧客問蘋果多少錢,需要乙個乙個去查詢某乙個商品的 需要o n 時間。同樣是乙個價目本,但是按商品名稱字母排序的,這樣需要的時候更短為o logn 但這樣我還是覺得查詢太慢,怎麼辦,這時候需要一名能記住所有商品 的員工,這樣一...