我需要在一个巨大的字符串中找到给定模式的子字符串SIMILAR。源巨大的字符串长度可达100 Mb。模式相当短(10-100个字符)。问题是我不仅需要找到精确的子串,还需要找到与几个字符中的模式不同的类似子串(最大允许错误计数作为参数提供)。
有什么想法加快算法的速度吗?
答案 0 :(得分:1)
1)有许多与字符串搜索相关的算法。其中一个是着名的Knuth–Morris–Pratt Algorithm。
2)您可能还想以您正在使用的语言检查正则表达式(“正则表达式”)。他们肯定会帮助您找到与原始子类似的子串。
即。 [爪哇]
String pat = "Home";
String source = "IgotanewHwme";
for(int i = 0; i < pat.length(); i++){
//split around i .. not including char i itself .. instead, replace it with [a-zA-Z] and match using this new pattern.
String new_pat = "("+pat.substring(0, i)+")"+ "[a-zA-Z]" + "("+pat.substring(i+1, pat.length())+")";
System.out.println(new_pat);
System.out.println(source.matches("[a-zA-Z]*"+new_pat+"[a-zA-Z]*"));
}
我觉得很容易让它接受任意数量的错误计数。
答案 1 :(得分:0)
听起来像你想要Fuzzy/Approximate String Matching。查看维基百科页面,看看您是否找不到适合您需求的算法。
答案 2 :(得分:0)
您可以查看Levenshtein distance,Needleman–Wunsch algorithm和Damerau–Levenshtein distance
它们为您提供评估两个字符串之间差异量的指标(即添加,删除,替换等的数量)。它们通常用于测量DNA之间的差异。
您可以轻松找到各种语言的实现。