演算法 字串Hash

2021-10-04 06:56:21 字數 958 閱讀 6318

字串hash主要應用在:在長度為n的主串s中匹配長度為m的匹配串t,返回起始位置。

通過字串hash函式把乙個任意長度的字串對映成乙個非負整數,並且其衝突概率為零。

取一固定值p,把字串看作p進製數,並分配乙個大於0的數值,代表每種字元。一般來說,我們分配的數值都遠小於p。取一固定值m,求出p進製數對m的餘數,作為該字串的hash值。

一般來說,我們取p = 131 或 13331,此時hash值產生衝突的概率極低,只要hash值相同,我們就可以認為原字串是相等的。通常我們取m = 2 ^ 64,即直接使用unsigned long long 型別儲存這個hash值,在計算時不處理算數溢位問題,產生的溢位相當於自動對 2 ^ 64取模。

記字串s的hash值為h(s),那麼在s後新增乙個字元c構成的新字串的 s + c 的hash值h(s + c) = (h(s) * p + val[c]) mod m。val[c]為字元c的代表數值。

同理去除字串首位(最高位)h[s] = h[c + s] - val[c] * p ^ length(s);

對於hash值在0 ~ n之間均勻分布的hash函式,出現不同字串hash值相等的期望步驟是o(sqrt(n)),在可以當作選取hash函式的參考。

同時為了及降低出現相同hash值的概率,可以採取雙雜湊來降低出現相同hash值的概率,只有兩個hash值相等才認定字串匹配。如取:10 ^ 9 + 7 與 10 ^ 9 + 9。

#include

#include

#include

using

namespace std;

typedef

unsigned

long

long ull;

ull base =

131;

intmain()

cout<}

字串hash-二喵君

演算法 字串hash

題目描述 很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。...

字串 字串雜湊hash演算法

以洛谷p3370為引子引入吧 雜湊其實是所有字串操作中,筆者認為最簡單的操作了 except輸入輸出qwq 雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複 就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq 通過這種方式來替代一些很費時間的操作。比如,最常見...

ELFHash字串Hash演算法

字串hash無論是在acm競賽中還是在工程中都有著廣泛的應用,所以很有必要掌握好它的用法。主要分為兩個部 分 hash對映和衝突處理。而本文主要來詳細講解hash對映的方法及應用,下篇文章將會介紹如何處理衝突。對於字串hash來說都是把字串對映為乙個整數,這一步是通過hash函式來進行的。常用的ha...