2

我在 Java 中创建了一个 boggle 求解器,它需要大约 1 分 30 秒来解决一个板,我确信它是因为我遍历我的字典的方式。这个想法是它检查它是否是一个单词,并查看它是否是一个有效的前缀。如果它是一个有效的前缀,它将返回 true 以便程序继续运行。如果它返回 false,那么程序将停止运行它正在学习的课程。我阅读了有关 trie 结构的信息,但我不太了解如何实现它们。带有书面代码的示例,一个小的解释将不胜感激

private ArrayList <String> dic = new ArrayList<String>(/*dictionary()*/);//my useable dictionary
private ArrayList <String> dicFinal = new ArrayList<String>();//all the words found
private ArrayList <String> checked = new ArrayList<String>();//all words that have   already been checked go here
public boolean CheckTest (String word)throws IOException{//if its impossible to create a word with the combination of letters then it returns false, 
    String backw=reverse(word);
    boolean isValid = true;     
    if (word.length()<=1){isValid = true;}
    else if (checked.contains(word)&&checked.contains(backw)){}
    else{
        boolean isWord=true;
        if(checked.contains(word)){}
        else if(dic.contains(word)==true){
            setCount(getCount()+1);
            dicFinal.add(word);
            dic.remove(word);
            isWord=true;
        }
        else
            isWord=false;
        if(checked.contains(backw)==true){}
        else if (dic.contains(backw)==true){
            setCount(getCount()+1);
            dicFinal.add(backw);
            dic.remove(word);
        }
        if(isWord==false){
            for(int i=0;i<dic.size();i++){
                if(word.length()<=dic.get(i).length()&&dic.get(i).substring(0, word.length()).equalsIgnoreCase(word.substring(0, word.length()))){
                    isValid=true;
                    i=dic.size();
                }
                else 
                    isValid=false;
            }
        }
    }
    checked.add(word);
    checked.add(backw);
    return isValid;
}
4

1 回答 1

0

I'd suggest that the first thing to do would be to make dic and checked HashSets instead of ArrayLists, which will give you O(1) access time instead of O(N). If your supposition that these lookups are the key bottleneck is correct, your program's performance should improve enormously.

If that doesn't improve matters enough, it would be worth investing a few minutes in learning how to profile Java programs so that you can pinpoint where the problem lies.

于 2013-03-08T04:13:49.350 回答