繁体   English   中英

java-加速递归函数

[英]java - Speed up recursive function

我正在研究此拼写检查器,我用来向用户建议更正的方法之一是在单词中插入多个字符。 这允许将诸如exmpl类的exmpl更正为example这是实际的代码:

public static Set<String> multiInsert(String word, int startIndex) {
    Set<String> result = new HashSet<>();

    //List of characters to insert
    String correction = "azertyuiopqsdfghjklmwxcvbnùûüéèçàêë";

    for (int i = startIndex; i <= word.length(); i++) {
        for (int j = i + 1; j <= word.length(); j++) {
            for (int k = 0; k < correction.length(); k++) {
                String newWord = word.substring(0, j) + correction.charAt(k) + word.substring(j);

                result.addAll(multiInsert(newWord, startIndex + 2));

                if(dico.contains(newWord)) result.add(newWord);
            }
        }
    }

    return result;
}

此功能的问题在于,处理该单词需要花费很多时间,尤其是当单词较长或我要纠正的单词过多时。 有没有更好的方法来实现或优化此功能?

变慢的原因是您正在测试不在字典中的字符串。 比字典中的单词有更多可能的拼写错误。 您需要以字典为指导。

这是一般的拼写纠正问题。 我已经编程了好几次了

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

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

性能受真实距离乘以字典大小的限制。 缺少这一点,它在真实距离中是指数的。 由于每次步行的费用是前一次步行的倍数,因此时间受最终步行的支配,因此先前的步行不会增加太多时间。

将字典组织为特里字典是有好处的,因为特里字典只是有限状态机的一种特殊形式。 您可以向其添加子机来处理常见的前缀和后缀,而无需大量扩展字典。 考虑一下这些词:民族,民族,民族主义,民族主义,民族主义,民族主义……。这些词可能并不常见,但并非不可能。 带有后缀的trie可以轻松处理它们。 类似的前缀,例如前置,后置,取消,取消,输入等。

您可以看看Jazzy ,它是Java拼写检查器API。

您可能还需要考虑模糊字符串匹配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM