2016-04-24 7 views
5

私はJavaでBoggleのゲームを作ろうとしています。私のプログラムでは、ボードをランダム化すると、可能な組み合わせを繰り返し、有効な単語であるかどうかを確認するための辞書リストを作成します。それは正常に動作しますが、プログラムは3〜4分かかります。これは主に辞書のサイズによるものです。私が使っているものは約19kの言葉を持っていて、すべての組み合わせを比較するには時間がかかります。Javaの大きなリストの一部のみを繰り返します。

if (str.length()>3&&!key.contains(str)&&prefixes.contains(str.substring(0,3))&&dictionary.contains(str)){ 
     key.add(str); 
    } 

strは組み合わせが生成されます。ここで私はより速くしようとしているコードの一部です。 prefixesはこのように書きdictionaryに基づいて、私が作成したリストです:

strはxskfjh」のようなjibberishときになるように、まさにそのような「ABB」と「傷」として辞書にすべての3つの文字の接頭辞を追加し
public void buildPrefixes(){ 
    for (String word:dictionary){ 
     if(!prefixes.contains(word.substring(0,3))){ 
      prefixes.add(word.substring(0,3)); 
     } 
    }  
} 

"辞書全体に対してチェックされることはありません。ちょうどprefixesは1k単語のようなものです。

私は何をしようとしていることstrと同じ最初の文字を持っている辞書で単語だけを反復することで、時間を削減されるので、strは「修道院」であるならば、それだけでその言葉に対してstrをチェックしますリスト全体ではなく「a」で始まります。これは、時間を大幅に短縮します。あるいは、同じプレフィックスを持つ単語に対してはstrをチェックするだけです。私はJavaにはかなり慣れていますので、あなたの答えが分かりやすいのであれば、本当に感謝しています。

+0

マップ>またはその行に沿ったものを使用したいかもしれません。これはあなたの検索を26のチャンクに分割し、いくらか検索を高速化します。しかし、おそらくあなたが探しているのは、グラフを効率的に構築して検索する方法です。 –

+0

グーグルでこれを見つけました... http://www.wutka.com/dawg.html興味深いもの –

+1

あなたはトライを再考しようとしています – AdamSkywalker

答えて

2

どのようなコメントが言いたいのですか?ホイールを再発明しないでください。 JavaはAssemblerやCではなく、そのような簡単なケースを処理するのに十分強力です。複製された20,000からあなたは125個の単語を見ることができるように自分のコンピュータ上で

import java.util.Set; 
import java.util.TreeSet; 

public class Work { 

    public static void main(String[] args) { 
     long startTime=System.currentTimeMillis(); 
     Set<String> allWords=new TreeSet<String>(); 
     for (int i=0; i<20000;i++){ 
      allWords.add(getRandomWord()); 
     } 
     System.out.println("Total words "+allWords.size()+" in "+(System.currentTimeMillis()-startTime)+" milliseconds"); 

    } 

    static String getRandomWord() { 
     int length=3+(int)(Math.random()*10); 
     String r = ""; 
     for(int i = 0; i < length; i++) { 
      r += (char)(Math.random() * 26 + 97); 
     } 
     return r; 
    } 
} 

はそれが

Total words 19875 in 47 milliseconds 

を示しています は、簡単な設定が簡単にあなたの語彙を扱うことができることを示した簡単なコードです。そして、非常に非効率な方法で2万語を生成するだけでなく、重複をチェックするだけでなく、それらを保存する時間もかかった。

関連する問題