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模糊匹配方法这里有一个关于[有效距离计算]()