這個演算法的目標是實現字串查詢功能,解決了字串查詢中匹配失敗後回溯重新匹配的問題。
目標:在 abbaabbaaba字串中找到 abbaaba 。
甲(data):abbaabbaaba
乙(pattern):abbaaba
傳統的暴力求解:甲從頭開始與乙一一比較,發現第 7 個字元不匹配。甲會回退到自己的第 2 個字元,乙則回退到自己的開頭,然後兩人開始重新比較。然後 不匹配,回退,不匹配,回退,……
kmp的核心思想:甲不回退,只進行乙回退。那麼,乙需要回退多少才能保證甲即使不回退,甲之前位置的字元與乙就匹配呢?這時候就需要引入最大公共元素單元長度這個概念了。下面的**簡述了最大公共元素單元長度的計算方式。
pattern最大公共元素單元:
長字串的最大公共元素是在短子字串的最大公共元素基礎上增加的,如 a, ab, abc, abca ....
這個結論很重要,後面乙回退的位置都是子字串的最大公共元素所處於的偏移位置。
所有最大公共元素單元長度組成的資料就是我們需要的next陣列,那怎麼求呢?
next陣列中第n個位置儲存的是長度為n的字串中的最大公共元素單元長度。
為什麼k縮小公式為 k=next[k-1] ?
其實本質上就是找k公共子串以外的其他公共子串,最長的不行,挑短的試試。
之所以是next[k-1],是因為 next[k-1]的最長公共子串,同樣也是pattern[k]的公共子串,只是不是最長的而已。(根據對稱性很容易得到)而pattern[k-1] pattern[k-2]這些並不是pattern[k]的公共子串。
構造next陣列
void make_next(char *pattern, int *next)
next[q] = k;}}
kmp演算法kmp的過程非常接近next的求取過程,不過會將next提前算好。data資料每次移後乙個位置,然後遍歷next去進行匹配,不過這兒的next遍歷的步長不是1,也不是固定的 ,而是當前pattern[j]字串最大公共子串位置,也就是 j = next[j-1]。
為什麼這麼選,上面也有說了,next[j-1]位置的公共子串也是pattern[j]的公共子串,只不過長度短了些。而pattern[j-1] pattern[j-2]這些並不是pattern[j]的公共子串。
int kmp(char *data, char *pattern)
int next[100] = ;
make_next(pattern, next);
for (i = 0, j = 0; i < n; i++)
if (j == m)
break;
}if (j == m)
return i-m+1;
else
return -1;
}
伺服器算力測試
文字分類的專案,有個需求是測伺服器算力,最終填寫 如下 需要測試的是一秒能跑多少詞,多少條文本,以及每個詞和文字占用的記憶體和視訊記憶體。測試方式 去除模型載入等不需要的時間,採取逐步加資料量的方式,通過差值計算。一 測試執行時間 from time import time start time f...
linux開發伺服器環境
由於換電腦,重新配置了哈伺服器,都是我的悲劇,用ghost盤對盤對拷的時候選錯了順序,悲劇發生,只有重新配置。配置samba的時候老是寫不進去,找了半天原因,由於寫對單詞了。還是redhat el 6.samba共享建立 首先將全域性設定為share vi etc samba smb.conf 先在...
Linux伺服器開發初步
伺服器開發需要考慮的內容很多,比如伺服器的架構 穩定性 效能以及負載能力等等。事實上,在開發伺服器的過程中,需要綜合考慮各種因素,比如就客戶端連線時間較短卻又比較頻繁的伺服器 例如 伺服器 而言,在可選的伺服器結構中,預先派生進 執行緒的結構就要比並髮式結構高效,這一點將在後續的文章中對其進行詳細的...