相似子串快速搜索

Posted

技术标签:

【中文标题】相似子串快速搜索【英文标题】:Similar substring fast search 【发布时间】:2011-08-31 19:44:45 【问题描述】:

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

有没有办法加快算法的速度?

【问题讨论】:

您是否正在寻找一种针对单个查询进行优化的算法?或者indexing strategy 将创建给定 100MB 源文本的数据结构,以便优化所有类似性质的查询? 【参考方案1】:

1)有很多与字符串搜索相关的算法。其中之一就是著名的Knuth–Morris–Pratt Algorithm。

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]*"));

我认为让它接受任意数量的错误计数很容易。

【讨论】:

【参考方案2】:

听起来你想要Fuzzy/Approximate String Matching。查看 Wikipedia 页面,看看是否找不到适合您需求的算法。

【讨论】:

【参考方案3】:

你可以看看Levenshtein distance、Needleman–Wunsch algorithm和Damerau–Levenshtein distance

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

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

【讨论】:

以上是关于相似子串快速搜索的主要内容,如果未能解决你的问题,请参考以下文章

bzoj3230 相似子串

51 NOD 1753 相似子串 字符串hash

搜索引擎中相似字符串查找那些事儿

3230: 相似子串

[BZOJ3230]相似子串

bzoj 3230 相似子串——后缀数组