运行Boggle Solver需要一个多小时的时间.我的代码出了什么问题



所以我在NetBeans IDE上用java运行一个Boggle Solver。当我运行它时,我必须在10分钟左右后退出,因为它最终需要大约2个小时才能完全运行。我的代码有什么问题吗?或者有什么方法可以让它更快?

public void findWords(String word, int iLoc, int jLoc, ArrayList<JLabel> labelsUsed){
if(iLoc < 0 || iLoc >= 4 || jLoc < 0 || jLoc >= 4){
return;
}
if(labelsUsed.contains(jLabels[iLoc][jLoc])){
return;
}
word += jLabels[iLoc][jLoc].getText();
labelsUsed.add(jLabels[iLoc][jLoc]);
if(word.length() >= 3 && wordsPossible.contains(word)){
wordsMade.add(word);
}
findWords(word, iLoc-1, jLoc, labelsUsed);
findWords(word, iLoc+1, jLoc, labelsUsed);
findWords(word, iLoc, jLoc-1, labelsUsed);
findWords(word, iLoc, jLoc+1, labelsUsed);
findWords(word, iLoc-1, jLoc+1, labelsUsed);
findWords(word, iLoc-1, jLoc-1, labelsUsed);
findWords(word, iLoc+1, jLoc-1, labelsUsed);
findWords(word, iLoc+1, jLoc+1, labelsUsed);
labelsUsed.remove(jLabels[iLoc][jLoc]);
}

这是我调用这个方法的来源:

public void findWords(){
ArrayList <JLabel> labelsUsed = new ArrayList<JLabel>();
for(int i=0; i<jLabels.length; i++){
for(int j=0; j<jLabels[i].length; j++){
findWords(jLabels[i][j].getText(), i, j, labelsUsed);
//System.out.println("Done");
}
}
}

edit:顺便说一句,我使用的是GUI,板上的字母是用JLabel显示的。

好吧,对于初学者来说,你运行ArrayList.contains()(labelsUsed.contains(..))很多次,每次都是O(n)——你应该考虑使用更高效的数据结构——如果可能的话,比如Set(没有重复元素)。

您混合了迭代和递归方法,因此findWords方法被称为,类似于n^n次,而不是n次。

移除findWords方法的八条findWords...行,或者移除main的两个for循环。

相关内容

  • 没有找到相关文章

最新更新