java-加速递归函数

java-加速递归函数,java,performance,recursion,optimization,spell-checking,Java,Performance,Recursion,Optimization,Spell Checking,我正在开发这个拼写检查器,我用来向用户建议更正的方法之一是在单词中插入多个字符。这允许将exmpl之类的单词更正为example 以下是实际代码: public static Set<String> multiInsert(String word, int startIndex) { Set<String> result = new HashSet<>(); //List of characters to insert String

我正在开发这个拼写检查器,我用来向用户建议更正的方法之一是在单词中插入多个字符。这允许将
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;
}
publicstaticsetmultiinsert(字符串字,int-startIndex){
Set result=new HashSet();
//要插入的字符列表
字符串更正=“azertyuiopqsdfghjklmwxcvnùèèèè”;

对于(inti=startIndex;i来说,让它变慢的是您正在测试字典中没有的字符串。 可能的拼写错误比字典里的单词多得多。 你需要以字典为指导

这是一般的拼写纠正问题。 我有

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

所以你可以循环进行,每次都增加界限。 首先,你用一个0的界来做,所以它只会找到一个精确的匹配。 这相当于普通的trie搜索。 如果没有匹配,则以1为界再次行走。 这将查找与原始单词距离为1的所有词典单词。 如果这没有产生任何结果,那么将绑定增加到2,依此类推。 (构成距离增量的是您选择的任何变换,如插入、删除、替换或更一般的重写。)

性能受真实距离乘以字典大小的限制。 除此之外,真实距离是指数级的。由于每次步行的成本是前一次步行的一倍,时间主要由最后一次步行决定,因此前一次步行不会增加太多时间

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

您可以看看哪个是Java拼写检查器API


你也可以考虑。

我建议在优化和算法方面多看一些,例如这是初学者的一个很好的指南。基本上,你添加的每一个周期都会使算法变得更加困难,并且每一个递归步骤经历3个不同的循环会花费很多时间。所以我建议重新编码你自己的AlgORI。thm(简化)或搜索已创建的算法。你看,这是一个学校项目,目标是从头开始制作拼写检查器,因此我不能使用Jazzy,但是从你链接的问题来看,我将研究levenshtein模糊匹配方法这里有一个关于[有效距离计算]()