我想要做的是:
给定一个输入字符串-INSTR:
和一组候选字符串-CAND:"BCDEFGH"
找到任何与INSTR匹配的CAND字符串。 在这个例子中,我会匹配"CDE"、"FG"和"H"(但不是"AB"和"IJ")。"AB","CDE","FG","H","IJ"
可能有许多千个候选字符串(在CAND中),但更重要的是,我将进行这种搜索很多次,因此需要快速解决问题。
我想使用char数组。此外,我对架构解决方案(如分布式搜索)不感兴趣,只需要在本地执行最有效的函数/算法。
此外,所有CAND和INSTR中的字符串都相对较小(<50字符)-即目标字符串INSTR与候选字符串相比并不长。
更新:我应该提到,CAND字符串集在所有INSTR值上不变。
更新:我只需要知道是否存在匹配,而不需要知道匹配是什么。
最后更新:我选择尝试AhoCorsick和Rabin-Karp,因为它们易于实现。 由于我有可变长度的模式,我使用了修改过的Rabin-Karp算法来哈希每个模式的前n个字符,其中n是最小模式的长度,N是我的滚动子字符串搜索窗口的长度。 对于Aho Corsick,我使用了这个。
在我的测试中,我在两篇报纸文章中搜索了1000个模式,并在1000次迭代中计算出平均完成时间等...
标准化的完成时间如下:
AhoCorsick: 1
RabinKarp: 1.8
Naive Search(检查每个模式并使用string.contains):50
*以下是一些描述上述算法的资源:
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html
http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2x2.pdf