Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 - Fatal编程技术网

Java 为字符串生成删除、插入、替换和转置

Java 为字符串生成删除、插入、替换和转置,java,algorithm,Java,Algorithm,我正在实现一个拼写检查算法。我构建了一个Trie,用于存储我的单词,以便快速搜索 当传递给定的输入字符串时,我想做的是为该字符串生成潜在的删除、插入、替换和换位,编辑距离为1。使用此超集,我可以尝试在我的Trie中查找单词,并向用户提供“你是说什么?”类型的结果 我在网上看过,大多数解决方案都提到计算Levenstein距离。只有当您已经知道这两个字符串并且希望找到这两个字符串之间的编辑距离时,这才有效 建议?我会使用两次通过的算法: 通过1 查看并计算所有与拼写检查单词相同字母开头的单词的距离

我正在实现一个拼写检查算法。我构建了一个
Trie
,用于存储我的单词,以便快速搜索

当传递给定的输入字符串时,我想做的是为该字符串生成潜在的删除、插入、替换和换位,编辑距离为1。使用此超集,我可以尝试在我的
Trie
中查找单词,并向用户提供“你是说什么?”类型的结果

我在网上看过,大多数解决方案都提到计算Levenstein距离。只有当您已经知道这两个字符串并且希望找到这两个字符串之间的编辑距离时,这才有效


建议?

我会使用两次通过的算法:

通过1

查看并计算所有与拼写检查单词相同字母开头的单词的距离。这会很快。当字符数大于拼写单词长度+2(显然是另一个单词)时,可以停止深度搜索
显示pass1的结果,如用红色下划线标记单词

通过2次

查找所有单词,当长度+3或4时停止
更新过程1中发现的结果(p>1)你可以通过trie树遍历并计算levenstein距离(使用一些切割启发法)hmmm不是一个坏建议…你能添加更多吗?因此,levenstein算法我们可以描述为递归函数D(i,j),它接受(m,n),其中m-第一个字符串的长度,n-第二个字符串的长度。让我们修复第一个字符串,并将其视为输入字符串。因此,计算d(“输入”,“ab”)调用d(“输入”,“a”)。计算d(“输入”,“ac”)调用d(“输入”,“a”)。看见您可以计算当前节点的ldistance,遍历到child并根据当前节点的precalf计算它们的ldistance。现在,关于切割启发式。你不需要ldistance>=7的单词。更多:您只需要N个单词就可以向用户推荐它们。您建议对treeyep使用某种djkstra算法来生成word的所有修改。所有修改的生成都很慢。所以最好计算trie中所有单词的Levenstain距离,因为所有单词都有一些通用前缀,并且它们的LD可以被缓存。你能提供一些代码吗?如果我得到字符串测试,我想生成tst tes tast tbst或etst等,然后根据我的trie测试该输入。我不会生成tst tes tast等。您应该迭代trie,并计算从trie中的正确单词到要进行拼写检查的单词的leving距离。仅当单词的距离为1或2时,才将其添加到结果列表中。最后,通过leving distance对结果进行排序,并显示前5个结果。当您说“迭代”trie时,假设输入为“trst”(用户输入了一个错别字),我是否会尽可能深入trie并生成所有可能的结果,直到达到最准确的字符?例如,给定输入“trst”,我将开始遍历trie。我看到“t”匹配,然后继续,我看到“r”缺失。我是否应该通过trie中的其余节点,然后比较levenstein距离?@dnkoutso yep。您必须在所有方向上进行遍历,即使它们不包含字符(或包含新字符/其他字符)。您的剪切启发式-levDistance>length(word)+MagicConstant以“t”开头并迭代子树,这样您就可以为所有以t开头的单词计算levin dist。(当这起作用时,您可以引入一个停止条件,在该条件下,对trie进行更深入的迭代是没有意义的)。在trie中的某个地方,您可以找到dist=1的单词“test”,将object(test,1)添加到您的候选结果中。