昨天晚上,被一道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 但這樣我還是覺得查詢太慢,怎麼辦,這時候需要一名能記住所有商品 的員工,這樣一...