Rabin-Karp搜索算法工作正常,但任何人都可以帮助指导我将其修改为递归搜索吗? http://algs4.cs.princeton.edu/53substring/RabinKarp.java.html。 例如:
* **pattern:** rar
* **text:** abacadabrararbracabrarararacadabrabrarbracad
* **match1:** rar
* **match2:** rar
* **match3:** rar
* **match4:** rar
* **match5:** rar
* **match5:** rar
还有其他更快的递归文本匹配搜索算法吗?
解
从http://johannburkard.de/software/stringsearch/添加外部库以构建路径。下面的代码将返回匹配的所有起始位置。包括像match1和match2这样的嵌入式内容。
import com.eaio.stringsearch.BNDM;
String pattern = "rar";
String text = "abacadabrararbracabrarararacadabrabrarbracad";
// Loop through text to get starting position of matched pattern.
List<Integer> matchPoint =new ArrayList<Integer>();
int slice = -1;
while (slice<text.length()){
slice+=1;
com.eaio.stringsearch.BNDM result = new BNDM();
int pos = result.searchString(text, slice, pattern);
if (pos != -1) {
slice = pos;
matchPoint.add(pos);
}
}
答案 0 :(得分:2)
当然有。我不建议在搜索字符串中的小图案时使用Rabin-Karp。 KMP,即Knuth-Morris-Pratt算法需要线性时间和线性附加内存,并且可以返回所有匹配,而不会遇到在处理Rabin-Karp时发生冲突的情况。请阅读wiki。这个算法有点难以理解,但代码更短,一旦你做对了,你会感到非常满意。
答案 1 :(得分:1)
对于较长的模式,Boyer-Moore algorithm或Horspool's algorithm等变体通常更快。 Boyer-Moore算法不是特别适合大字母表。如果文本可以是完整的Unicode范围,则它将使用相当大的移位表,但如果文本是ASCII或latin1,则查找表的额外空间很小。对于大型字母表,我也推荐使用KMP。