2016-04-24 96 views
5

我試圖在Java中創建一個Boggle遊戲,並且對於我的程序,一旦我隨機化了該板,我有一種方法可以遍歷可能的組合,並將每一個與一個字典列表來檢查它是否是一個有效的單詞,如果是的話,我把它放在關鍵字中。它工作正常,但程序需要三到四分鐘來生成密鑰,這主要是由於字典的大小。我使用的是約19k字,比較每個組合需要花費大量的時間。下面的代碼中,我試圖做出更快的一部分:遍歷java中的大部分列表

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

其中str產生的組合。 prefixes是一個列表我生成基於​​dictionary認爲是這樣的:

public void buildPrefixes(){ 
    for (String word:dictionary){ 
     if(!prefixes.contains(word.substring(0,3))){ 
      prefixes.add(word.substring(0,3)); 
     } 
    }  
} 

這只是增加了所有的三個字母前綴在詞典如「ABB」和「月」,這樣,當str是jibberish像「xskfjh 「它不會被整個字典檢查,只是prefixes這就像1k字。

我試圖做的是通過僅在具有相同的第一個字母爲str字典中的單詞進行迭代削減時間,所以如果str是「修道院」,那麼它只會檢查str對詞從「a」開始,而不是整個列表,這將大大縮短時間。或者甚至更好,它只檢查str對具有相同前綴的單詞。我對Java很新,所以如果你的答案非常具有描述性,我會非常感激,謝謝!

+0

看起來您可能想要使用地圖>或沿着這些線的東西。這將你的搜索分成26個大塊,並且會加快搜索速度。但你可能正在尋找的是一種有效的方式來建立和搜索一個圖形 –

+0

發現這個雖然谷歌搜索... http://www.wutka.com/dawg.html有趣的東西 –

+1

你試圖重塑Trie – AdamSkywalker

回答

2

什麼意見試圖說是 - 不要重新發明輪子。 Java不是彙編語言或C語言,它足夠強大來處理這種微不足道的情況。 下面是簡單的代碼表明,簡單的設置可以處理你的詞彙簡單:

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 

正如你可以看到125個字了20000進行復制。不僅花費時間以非常低效的方式生成20,000個單詞,而且還存儲它們以及檢查重複項。