我需要在一个巨大的字符串中寻找类似于给定模式的子字符串。源字符串可能长达100Mb。模式相对较短(10-100个字符)。问题是,我不仅需要找到精确匹配的子字符串,还需要找到与模式有几个字符不同的相似子字符串(最大允许错误计数作为参数提供)。
有没有什么办法可以加快算法速度?
我需要在一个巨大的字符串中寻找类似于给定模式的子字符串。源字符串可能长达100Mb。模式相对较短(10-100个字符)。问题是,我不仅需要找到精确匹配的子字符串,还需要找到与模式有几个字符不同的相似子字符串(最大允许错误计数作为参数提供)。
有没有什么办法可以加快算法速度?
1)与字符串搜索相关的算法有很多种。其中一种著名的算法是Knuth-Morris-Pratt算法。
2)您可能还想在使用的任何语言中检查正则表达式(“Regex”)。它们肯定会帮助您找到与原始子字符串“相似”的子字符串。
例如[Java]
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]*"));
}
我认为很容易让它接受任意数量的错误计数。
你可以查看Levenshtein距离, Needleman-Wunsch算法和Damerau-Levenshtein距离
它们提供了评估两个字符串之间差异的度量标准(即添加、删除、替换等的数量)。它们经常用于测量DNA之间的变异。
你可以很容易地在各种编程语言中找到实现。