相似子串快速搜索
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 之间的变异。
您可以轻松找到各种语言的实现。
【讨论】:
以上是关于相似子串快速搜索的主要内容,如果未能解决你的问题,请参考以下文章