我想要一个有效的算法(或库),我可以使用在Java中搜索字符串中的子字符串。
我想做的是:
给定一个输入字符串 – INSTR:
“BCDEFGH”
和一组候选字符串 – CAND:
“AB”, “CDE”, “FG”, “H”, “IJ”
查找与INSTR中的子串匹配的任何CAND字符串
在这个例子中,我会匹配“CDE”,“FG”和“H”(但不是“AB”和“IJ”)
可能有许多候选字符串(在CAND),但更重要的是,我将这样搜索数百万次,所以我需要它是FAST。
我想使用char数组。此外,我不是嵌入在建筑解决方案,如分布搜索 – 只是最有效的功能/算法在本地。
另外,CAND和INSTR中的所有字符串都将相对较小(<50字符),即目标字符串INSTR相对于候选字符串不是长。 更新我应该提到,CAND字符串的集合在INSTR的所有值上是不变的。 更新我只需要知道有一个匹配 – 我不需要知道什么是匹配。 最后更新
我选择尝试AhoCorsick和Rabin-Karp,由于简单的实现。
因为我有可变长度模式我使用修改Rabin-Karp散列每个模式的前n个字符,其中n是最小模式的长度,N是我滚动子字符串搜索窗口的长度。
对于Aho Corsick我使用this
在我的测试中,我在两个文档中搜索了1000个模式的报纸文章,平均跨1000迭代等…
标准化完成时间为:
AhoCorsick:1
RabinKarp:1.8
Naive搜索(检查每个模式&使用string.contains):50
*一些资源描述在下面的答案中提到的algos: