2016-04-24 12 views
5

Java bir Boggle oyunu yapmaya çalışıyorum, ben tahta rastgele bir kez benim program için bir her biri karşılaştırır olası kombinasyonların arasında dolaşır ve bir yöntemi var Geçerli bir kelime olup olmadığını kontrol etmek için sözlük listesi ve eğer evet ise, anahtarın içine koydum. Bu, gayet iyi çalışıyor ancak programı nedeniyle sözlüğe büyüklüğüne çoğunlukla anahtarı oluşturmak için üç ya da dört dakika sürer. Kullandığımın 19k kelimesi var ve her kombinasyonu karşılaştırmak bir ton sürüyor.Bıkmadan

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

str kombinasyonu oluşturulur: İşte daha hızlı yapmaya çalışıyorum kod parçası. prefixes böyle gider ben dictionary göre oluşturulan bir listesi: böyle "abb" ve "mar" olarak sözlükte her üç harfli önekler ekleyen

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

böylece str alay etmeleri "xskfjh gibi olduğunda "bu bütün sözlüğe göre kontrol almazsınız, sadece prefixes 1k kelimeler gibi şeydir. str aynı ilk mektup sözlükte sadece kelimelerin yineleme tarafından zaman azaltmak, böylece str ise "Manastır" ise, yalnızca kelimelerin karşı str kontrol edecek ne yapmaya çalışıyorum

o Tüm listenin yerine "a" ile başlayın, bu da önemli ölçüde azalır. Hatta daha da iyisi, sadece aynı öneki olan kelimeler karşı str denetler. Java için oldukça yeni biriyim, bu yüzden cevaplarınızda çok açıklayıcıysanız gerçekten çok memnun olurum, teşekkürler! comments söylemeye çalıştığımız şey

+0

Bir Harita > ya da bu satırlarda bir şeyler kullanmak isteyebileceğinizi düşünüyor. Bu, aramanızı 26 parçaya böler ve biraz arama yapmayı hızlandıracaktır. Ama muhtemelen aradığınız şey verimli bir grafik oluşturmak ve aramak için bir yoldur. –

+0

Bunu googling yaparken bulabilirsiniz ... http://www.wutka.com/dawg.html İlginç şeyler –

+1

Bir Trie icat etmeye çalışıyorsunuz – AdamSkywalker

cevap

2

olduğunu - tekerleği yeniden icat değil. Java Assembler veya C değildir ve bu tür önemsiz durumları ele alacak kadar güçlüdür. kopyalanıyordu 20,000 dışarı size 125 kelime Görüldüğü gibi benim bilgisayarda

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; 
    } 
} 

o

Total words 19875 in 47 milliseconds 

gösterir: Burada basit Seti kolay kelime işleyebilir göstermektedir basit bir koddur. Ve çok verimsiz bir şekilde 20,000 kelime üretmek ancak çiftleri için bunları saklamak hem de onay için sadece zaman aldı.