【演算法學習】字串Hash入門
阿新 • • 發佈:2019-02-10
字串Hash入門
字串Hash可以通俗的理解為,把一個字串轉換為一個整數。
如果我們通過某種方法,將字串轉換為一個整數,就可以便的確定某個字串是否重複出現過,這是最簡單的字串Hash應用情景了。
當然也不難想到,如果有不同的兩個字元串同時Hash到一個整數,這樣就比較麻煩了。我們希望這個對映是一個單射,所以問題就是如何構造這個Hash函式,使得他們成為一個單射。不用擔心,接下來的內容正要講解。
Hash方法
給定一個字串,對字母x,我們規定。 (當然也可以直接用的值)
自然溢位方法
Hash公式
unsigned long long Hash[n]
利用unsigned long long的範圍自然溢位,相當於自動對取模
單Hash方法
Hash公式
其中和均為質數,且有。
對於此種Hash方法,將p和mod儘量取大即可,這種情況下,衝突的概率是很低的。
舉例
如取,對字串進行Hash
hash[0] = 1
hash[1] = (hash[0] * 13 + 2) % 101 = 15
hash[2] = (hash[1] * 13 + 3) % 101 = 97
這樣,我們就認為字串當做97,即97就是 的hash值。
雙Hash方法
將一個字串用不同的 hash兩次,將這兩個結果用一個二元組表示,作為Hash結果。
Hash公式
hash結果為
這種Hash很安全。
獲取子串的Hash
如果我們求出一個串的Hash,就可以求解其子串的Hash值。
我們先以一個具體的例子來理解。
例子
假設有一的字串,設為第個字元,其中。
根據定義分別求出