java - 加速递归函数

时间:2015-12-05 14:21:13

标签: java performance recursion optimization spell-checking

我正在使用这个拼写检查器,我用来建议用户更正的方法之一是在单词中插入多个字符。这样可以将BooleanBinding isAddResourceButtonDefault = resourceNameTextField.focusedProperty().or( resourceTypeComboBox.focusedProperty()).or( divisibleResourceCheckbox.focusedProperty().or( maxInstancesTextField.focusedProperty()).or( addResourceButton.focusedProperty())); addResourceButton.defaultButtonProperty().bind(isAddResourceButtonDefault); 之类的字词更正为exmpl 这是实际的代码:

example

这个功能的问题在于需要花费很多时间来处理,特别是当单词很长或者我有太多的单词要纠正时。有没有更好的方法来实现这个功能或优化它?

2 个答案:

答案 0 :(得分:2)

让你慢慢的是你正在测试不在字典中的字符串。 拼写错误比词典中的单词更多。 你需要被字典引导。

这是一般的拼写纠正问题。 我programmed it several times

简而言之,该方法是将字典存储为trie,并对trie进行有限深度优先步行。 在每一步中,您都会跟踪trie中单词与原始单词之间的距离。 只要该距离超过界限,就可以修剪搜索。

所以你要循环,每次增加界限。 首先使用0的边界进行,因此它只能找到完全匹配。 这相当于普通的特里搜索。 如果没有产生匹配,请再次使用1的边界。 这将找到与原始单词相距1的所有字典单词。 如果没有产生任何结果,则将边界增加到2,依此类推。 (构成距离增量的是您选择的任何变换,例如插入,删除,替换或更一般的重写。)

性能受字典大小的真实距离限制。 除此之外,它在真实距离中是指数级的。由于每次步行费用是前一次步行的一倍,因此时间由最后一次步行控制,因此之前的步行不会增加太多时间。

将字典组织为trie是有利的,因为trie只是有限状态机的一种特殊形式。 您可以向其添加子机器来处理公共前缀和后缀,而无需大规模扩展字典。 请考虑这些话:民族,民族,民族主义,民族主义,民族主义,民族主义,...... 这些词可能并不常见,但并非不可能。 后缀trie很容易处理它们。 类似的前缀,如pre-,post-,un-,de-,in-等

答案 1 :(得分:0)

您可以查看Jazzy这是一个Java拼写检查程序API。

您可能还想考虑Fuzzy String Matching