4 2雜湊 演算法筆記

2021-10-04 22:28:37 字數 2346 閱讀 8752

4.2.1雜湊的定義與整數雜湊

1、雜湊 可以解決什麼問題?

有兩個集合,查詢乙個集合是否在另乙個集合**現過。

直觀的作法是遍歷兩個陣列,看是否有相等的。

對於每乙個x(陣列1),都遍歷一遍陣列2。

作法:用空間換時間, 即設定一乙個 bool型陣列hashtable[100010],

其中hashtable[x] = true 表示正整數x在n個正整數**現過,

而hashtable[x] == false表示正整數x在n個正整數中沒有出現過。

這樣就可以在一開始讀入n個正整數時就進行預處理,

即當讀入的數為x時,就令hashtable[x] = true

(說明: hashtable 陣列需要初始化為false, 表示初始狀態下所有數都未出現過)。

於是,對m個欲查詢的數,就能直接通過hashtable陣列判斷出每個數是否出現過。顯然這種做法的時間複雜度為o(n+m)

這道題目,沒有用到雜湊。

例題:要求m個欲查詢的數中每個數在n個數**現的次數

#include

const

int maxn=

100010

;int hashtable [maxn]=;

intmain()

return0;

}

這個策略暫時還有乙個問題一上面的題目**

現的每個數都不會超過10,因此直接作為陣列下標是可行的,但是如果輸入可能是10^9 大小

的整數(例如11111111),或者甚至是乙個字串(例如"i love you"),就不能將它們直接

作為陣列下標了。

所以要用到雜湊了。

2、雜湊的定義

一般來說,雜湊可以濃縮成一句話「將元素通過乙個函式轉換為整數,使得該整數可以盡量唯一地代表這個元素」。

其中把這個轉換函式稱為雜湊函式h,也就是說,如果元素在轉換前為key, 那麼轉換後就是乙個整數h(key)。

對key是整數的情況來說,有哪些常用的雜湊函式呢?

常用的有直接定址法、平方取中法、除留餘數法等,

2、1直接定址法是指恒等變換(即h(key)=key,本節開始的問題就是直接把key作為陣列下標,是最常見最實用的雜湊應用)

線性變換(即h(key;=a* key+b);

2、2平方取中法是指取key的平方的中間若干位作為hash值(很少用)。

2、3比較實用的還有除留餘數法

除留餘數法是指把key除以乙個數mod得到的餘數作為hash值的方法,即

h(key)= key % mod

通過這個雜湊函式,可以把很大的數轉換為不超過mod的整數,這樣就可以將它作為可

行的陣列下標(注意:表長tsize必須不小於mod,不然會產生越界)。顯然,當mod是乙個

素數時,h(key)能盡可能覆蓋[0, mod)範圍內的每乙個數。 因此一般為了方便起見,下文中取

tsize是乙個素數,而mod直接取成與tsize相等。

3、衝突

1.線性探查法(linear probing)。找下乙個。

2.平方探查法(ouadratic probing)找h(key)+ 12、h(key)- 12、h(key)+22 ……

3.鏈位址法(拉鍊法)。多個關鍵字key的hash值都是h時,就可以直接把這些衝突的key直接用單鏈表連線起來,此時就可以遍歷這

條單鏈表來尋找所有h(key)= h的key。

可以使用標準庫模板庫中的map (見6.4節)來直接使用hash的功能

(c++11以後可以用unordered map, 速度更快),因此除非必須模擬這些方法或是對演算法的效

率要求比較高,一般不需要自己實現上面解決衝突的方法。

4.2.2 字串hash初步

字串hash是指將乙個字串s對映為乙個整數,使得該整數可以盡可能唯一地代表字串s。

本節只討論將字串轉換為唯一的整數,高階部分在12.1節。

以乙個問題結尾:給出n個字串(由恰好三位大寫字母組成),再給出m個查詢字串,問每個查詢字串在n個字串**現的次數。

#include

const

int maxn =

100;

char s[maxn][5

],temp[5]

;int hashtable[26*

26*26+

10];int

hashfunc

(char s[

], int len)

return id;

}int

main()

for(

int i=

0; i< m; i++

)

《演算法筆記》雜湊

給出n個整數,在給出m個數,問這m個數中的每個數是否在n個數 現過 例如 n 5,m 3 n m 後者中只有7和2在n個整數 現過。思想 用空間換時間的方法。include using namespace std const int maxn 10010 bool hashtable maxn 表示...

演算法筆記 11 雜湊演算法

定義 將任意長度的二進位制串對映為固定長度的二進位制串,這個對映規則就是雜湊演算法 雜湊值 通過原始資料對映得到的二進位制串。優秀的雜湊函式的幾點要求 從雜湊值不能反向推導出原始資料 對輸入資料敏感,原始資料的微弱改變都會使得雜湊值很大的變化 雜湊衝突概率盡量小 雜湊演算法的執行效率盡量高效 為什麼...

雜湊演算法 雜湊演算法hash 理解筆記 編輯中

雜湊演算法 有兩個特點 加密過程不可逆,意味著我們無法通過輸出的雜湊資料倒推原本的明文是什麼 輸入的明文與輸出的雜湊資料一一對應,任何乙個輸入資訊的變化,都必將導致最終輸出的雜湊資料的變化。在區塊鏈中,通常使用sha 256 安全雜湊演算法 進行區塊加密,這種演算法的輸入長度為256位,輸出的是一串...