1. 程式人生 > >【演算法學習】字串Hash入門

【演算法學習】字串Hash入門

字串Hash入門

字串Hash可以通俗的理解為,把一個字串轉換為一個整數

如果我們通過某種方法,將字串轉換為一個整數,就可以便的確定某個字串是否重複出現過,這是最簡單的字串Hash應用情景了。

當然也不難想到,如果有不同的兩個字元串同時Hash到一個整數,這樣就比較麻煩了。我們希望這個對映是一個單射,所以問題就是如何構造這個Hash函式,使得他們成為一個單射。不用擔心,接下來的內容正要講解。

Hash方法

給定一個字串S=s1s2s3..sn,對字母x,我們規定idx(x)=xa+1。 (當然也可以直接用si

ASCII值)

自然溢位方法

Hash公式

unsigned long long Hash[n]

hash[i]=hash[i1]p+id(s[i])

利用unsigned long long的範圍自然溢位,相當於自動對2641取模

單Hash方法

Hash公式

hash[i]=(hash[i1])p+idx(s[i])%mod

其中pmod均為質數,且有p<mod

對於此種Hash方法,將p和mod儘量取大即可,這種情況下,衝突的概率是很低的。

舉例

如取p=13,mod=101,對字串abc進行Hash
hash[0] = 1
hash[1] = (hash[0] * 13 + 2) % 101 = 15
hash[2] = (hash[1] * 13 + 3) % 101 = 97

這樣,我們就認為字串abc當做97,即97就是abc 的hash值。

雙Hash方法

將一個字串用不同的mod hash兩次,將這兩個結果用一個二元組表示,作為Hash結果。

Hash公式

hash1[i]

=(hash1[i1])p+idx(s[i])%mod1

hash2[i]=(hash2[i1])p+idx(s[i])%mod2

hash結果為<hash1[n],hash2[n]>

這種Hash很安全。

獲取子串的Hash

如果我們求出一個串的Hash,就可以O(1)求解其子串的Hash值。
我們先以一個具體的例子來理解。

例子

假設有一|S|=5的字串,設Si為第i個字元,其中1i5

根據定義分別求出hash[i]

hash[1]=s1
hash[2]=s1p+s2