类似子串快速搜索

时间:2011-05-24 10:15:31

标签: algorithm performance search substring

我需要在一个巨大的字符串中找到给定模式的子字符串SIMILAR。源巨大的字符串长度可达100 Mb。模式相当短(10-100个字符)。问题是我不仅需要找到精确的子串,还需要找到与几个字符中的模式不同的类似子串(最大允许错误计数作为参数提供)。

有什么想法加快算法的速度吗?

3 个答案:

答案 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 distanceNeedleman–Wunsch algorithmDamerau–Levenshtein distance

它们为您提供评估两个字符串之间差异量的指标(即添加,删除,替换等的数量)。它们通常用于测量DNA之间的差异。

您可以轻松找到各种语言的实现。