运行Boggle Solver需要一个多小时才能运行。我的代码出了什么问题?

时间:2012-12-03 16:54:59

标签: java performance solver boggle

所以我在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");
        }
    }
}

编辑:BTW我正在使用GUI,并且使用JLabel显示板上的字母。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您正在混合使用迭代和递归方法,因此findWords方法被称为类似 n^n次而非n次。

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