Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中基于度量距离的快速字符串检索_Java_Algorithm_Search_Edit Distance_Metric - Fatal编程技术网

Java中基于度量距离的快速字符串检索

Java中基于度量距离的快速字符串检索,java,algorithm,search,edit-distance,metric,Java,Algorithm,Search,Edit Distance,Metric,给定一个任意字符串s,我想要一个快速检索所有字符串的方法⊆ 从一大组字符串M(其中| M |>100万),其中S的所有字符串从S具有最小编辑距离

给定一个任意字符串s,我想要一个快速检索所有字符串的方法⊆ 从一大组字符串M(其中| M |>100万),其中S的所有字符串从S具有最小编辑距离 在最坏的情况下,如果M中没有字符串符合此条件,则S可能为空,在最好的情况下,S={S}(完全匹配)。在这两者之间的任何情况下,我完全认为S可能相当大

一般来说,我希望最大编辑距离阈值是固定的(例如,2),并且需要在任意字符串s上多次执行此操作,因此需要一种有效的方法,因为天真地迭代和测试所有字符串会太贵

虽然我使用了编辑距离作为示例度量,但我也希望使用其他度量,例如Jaccard索引

有没有人能就可以实现这一点的现有Java实现提出建议,或者为我指出解决这个问题的正确算法和数据结构

更新#1

后来我了解到,这正是我所追求的那种结构,它利用距离度量,根据字符串之间的距离和度量来组织M中的字符串子集。和其他类似的度量树数据结构和算法似乎都是解决这类问题的理想方法。现在,要在Java中找到易于使用的实现

更新#2


结合使用此实现和此实现,我能够成功地从一百万个字符串的集合(m)中检索任意字符串的子集,检索时间大约为10毫秒。

尽管我自己从未尝试过,但它可能值得一看。我曾经为这篇文章添加了书签,这篇文章看起来相当详细,并提供了几个代码片段:


正如H W已经提到的,你将无法避免检查字典中的每个单词。但是,自动装置将加快计算距离的速度。将其与词典的高效数据结构相结合(如维基百科文章中提到的Trie),您可能能够加快当前的方法。

就是为这种情况而设计的。它适用于度量距离,如Levenshtein或Jaccard索引。

BK树,在同一博客中描述,是解决此问题的一种方法。有一些Java实现,例如这个(没有尝试过)。这里的方法似乎很合适,谢谢你的建议。它让我了解了度量树的一般知识,包括看起来也很合适的度量树。谢谢,我已经成功地使用了您推荐的bk树实现!