我想要一个可以在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