RollingHash求字串匹配

2021-06-18 03:11:17 字數 1977 閱讀 6172

字串匹配與查詢和兩個字串共同子串問題的計算時,有時會想到將字串中字元看整數,計算乙個子串的hash值,以字串匹配為例,模式串p(長度為l),待匹配串s(長度為n):

1)計算p字串的hash值,時間複雜度o(l)

2)對於字串s,計算s的長度為l的子串的hash值,每個hash值計算用時o(l),時間複雜度o(nl)

3)對於s的每個子串的hash值與p字串hash值進行比較,如果匹配,則該子串和p字串進行比較,時間複雜度o(l)

總共時間複雜度o(nl)。

對於上述計算的步驟2)可以通過使用rollinghash的方法來優化,對比相鄰兩個子串,可以看作,將前乙個子串的頭去掉,尾部加上下乙個字元,兩個子串的中間部分是相同的,可以構造乙個多項式形式的hash函式:

對於第0個子串的hash值:

hash[0] = (s[0]*b^(l-1)+s[1]*b^(l-2)+...+s[l-2]*b^1+s[l-1]*b^0

) mod m

對於第1個子串的hash值:

hash[1] = (s[1]*b^(l-1)+s[2]*b^(l-2)+...+s[l-1]*b^1+s[l]*b^0

) mod m

= ((hash[0]-s[0]*b^(l-1))*b+s[l]*b^0) mod m

根據hash[0],可以在o(1)時間內計算出hash[1]。

可以得到第k個子串的hash值

hash[k] =

((hash[k-1]-s[k]*b^(l-1))*b+s[k+l-1]*b^0) mod m

即,hash[k]可以根據hash[k-1]在o(1)時間計算得到。(如果將b選定為2的冪,則上述的乘法又可以轉換為移位操作,節省計算時間)

根據rollinghash進行字串的匹配:

1)計算p字串的hash值,時間複雜度o(l)

2)計算字串s的第乙個子串的hash值,時間複雜度o(l)

3)根據rollinghash計算字串s的其餘子串的hash值,時間複雜度o(n)

4)對於s的每個子串的hash值與p字串hash值進行比較,如果匹配,則該子串和p字串進行比較,時間複雜度o(l)

只要步驟4)所做比較的總時間為o(n),就可以保證總的時間複雜度是o(n)。

如果上述的hash函式碰撞次數為o(n),則步驟4)的時間複雜度為o(nl),總的時間複雜度為o(nl)。

字串的共同子串問題

兩個長度都為n的長字串t和s,判斷是否擁有長度為l的共同子串,仍然使用rollinghash:

1)計算字串s的第乙個子串的hash值,時間複雜度o(l)

2)計算字串s的其它子串的hash值,並儲存到hash表中,時間複雜度o(n)

3)計算字串t的第乙個子串的hash值,時間複雜度o(l)

4)計算字串t的其它子串的hash值,時間複雜度o(n)

5)如果t的某個子串命中了s的某個子串,則兩個子串進行比較,時間複雜度o(l)

同樣對於步驟5),當hash函式碰撞次數較多時,使得字串的比較成為瓶頸,可以通過擴大hash表的容量來減少hash函式碰撞次數。如hashtable容量為o(n^2),此時碰撞次數為o(1/n),但有時候沒有必要花費那麼多的空間,此時可以使用兩個hash函式來減少進行比較次數。為每個子串再分配乙個hash值,hash『[k],該hash函式將子串對映到n^2空間,在t子串命中時,比較與s子串的hash』,如果也相等,則再對兩個子串進行比較。

乙個字串string中,求出現次數多於1次的最長子串

分析:使用字串rollinghash及二分搜尋

時間複雜度:使用rollinghash判段乙個字串中是否存在多餘兩個長度為l的子串的時間複雜度是o(n),總共判斷logn次,時間複雜度o(nlogn)

求字串長度

問題及 檔名稱 main.cpp 作 者 王藝霖 完成日期 2016年3月20日 版 本 號 v1.0 問題描述 寫乙個函式,求乙個字串的長度,在main函式中輸出字元,並輸出其長度 輸入描述 輸入一行字串 輸出描述 輸出字串長度 includeusing namespace std int str...

求字串長度

目的 考察對strlen函式的使用 功能 求字串長度,統計並返回字串中第乙個 0 之前的有效字元的個數,注意不包括 0 占用的位元組數。strlen函式的常規寫法。include include int main 拓展 模擬實現strlen函式,求字串長度。0 是最關鍵的部分。include inc...

求字串長度

思路分析 迴圈法 呼叫函式傳參,迴圈條件為判斷字元陣列元素是否為真,若為真,引數加1,若為假返回0 遞迴法 遞推關係 1 strlen str 1 指標加1 出口 指標指向 0 完整 define crt secure no warnings include include include incl...