我想要一個可以在Java中用於搜索字符串中的子字符串的有效算法(或庫)。用於在字符串中搜索子字符串的快速算法
我想要做的是:
給定的輸入字符串 - INSTR:
「BCDEFGH」
而且一組候選串 - CAND :
「AB」, 「CDE」, 「FG」, 「H」, 「IJ」
找到任何CAND匹配的子字符串INSTR
中在這個例子中字符串我會匹配「CDE」,「FG」和「H」(但不是「AB」和「IJ」)
可能有很多候選字符串(在CAND中),但更重要的是我將執行此搜索數百萬次,所以我需要它快速。我想用char數組。另外,我並沒有將其構建爲解決方案,比如分發搜索 - 只是本地最有效的功能/算法。
此外,CAND和INSTR中的所有字符串都將相對較小(即字符數爲<),即目標字符串INSTR相對候選字符串不長。
更新我應該提到,集合CAND字符串是跨INSTR的所有值不變。
更新我只需要知道有一場比賽 - 我不需要知道比賽是什麼。
最終更新 我選擇嘗試AhoCorsick和拉賓卡爾普,由於簡單的實施。 因爲我有可變長度模式,所以我使用修改過的Rabin-Karp來散列每個模式的前n個字符,其中n是最小模式的長度,那麼N就是我的滾動子字符串搜索窗口的長度。 對於阿霍Corsick我用this
在我的測試中我兩個文件報紙文章搜索1000種模式,跨越1000次迭代等等均 標準化的完成時間爲:
AhoCorsick: 1
RabinKarp:1。8
樸素搜索(檢查每個圖案&使用string.contains):
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html
http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2x2.pdf:50個
*一些描述在下面的答案中提到的交易算法資源
http://www-igm.univ-mlv.fr/~lecroq/string/index.html *
順便說一句 - 這不是作業 - 但是一個現實世界的問題! – Joel 2009-11-19 18:42:09
與候選字符串相關的輸入字符串有多長? – 2009-11-19 18:43:06
他們很短。輸入字符串通常少於40個字符,候選字符串也是如此。 – Joel 2009-11-19 18:47:08