Bauen trie schneller

Mache ich eine mobile app, die die Bedürfnisse von tausenden von schnell-string-suchen und Präfix überprüft. Um diese Fahrt, machte ich einen Trie aus meiner word-Liste, die hat ungefähr 180.000 Wörter.

Alles Super, aber das einzige problem ist, dass der Bau dieser riesigen trie (es hat etwa 400.000 Knoten) dauert etwa 10 Sekunden derzeit auf meinem Handy, das ist wirklich langsam.

Hier ist der code, baut die Marina.

public SimpleTrie makeTrie(String file) throws Exception {
    String line;
    SimpleTrie trie = new SimpleTrie();

    BufferedReader br = new BufferedReader(new FileReader(file));
    while( (line = br.readLine()) != null) {
        trie.insert(line);
    }
    br.close();

    return trie;
}

Den insert Methode, die läuft auf O(length of key)

public void insert(String key) {
    TrieNode crawler = root;
    for(int level=0 ; level < key.length() ; level++) {
        int index = key.charAt(level) - 'A';
        if(crawler.children[index] == null) {
            crawler.children[index] = getNode();
        }
        crawler = crawler.children[index];
    }
    crawler.valid = true;
}

Ich bin auf der Suche nach intuitiven Methoden zu bauen, die versuche schneller. Vielleicht Baue ich die versuche einfach mal mein laptop, und speichern Sie es irgendwie an der Festplatte, und aus einer Datei laden in das Telefon? Aber ich weiß nicht, wie diese umzusetzen ist.

Oder gibt es irgendwelche anderen Präfix-Daten-Strukturen, die in weniger Zeit zu bauen, haben aber ähnliche lookup-Zeit-Komplexität?

Anregungen werden geschätzt. Vielen Dank im Voraus.

BEARBEITEN

Jemand schlug vor, mit Hilfe der Java-Serialisierung. Ich habe es versucht, aber es war sehr langsam mit diesem code:

public void serializeTrie(SimpleTrie trie, String file) {
        try {
            ObjectOutput out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
            out.writeObject(trie);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public SimpleTrie deserializeTrie(String file) {
        try {
            ObjectInput in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
            SimpleTrie trie = (SimpleTrie)in.readObject();
            in.close();
            return trie;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

Kann dieser obige code schneller gemacht werden?

Meine versuche: http://pastebin.com/QkFisi09

Wort-Liste: http://www.isc.ro/lists/twl06.zip

Android-IDE zum ausführen von code: http://play.google.com/store/apps/details?id=com.jimmychen.app.sand

  • Ich kann nicht installieren Sie die ide auf einem android gingerbread?
  • Ich würde vorschlagen, zu Beginn von profiling. Zumindest Messung von dem Teil verbracht, für (1) beim Lesen der Datei, (2) Suche nach Ort in trie-und (3) eine neue Verknüpfung zu erstellen
  • Hast du schon versucht die binary search Methode? Ich sah, wie gute Ergebnisse mit es.
  • Ja habe ich versuche es, aber es schien nicht zu schnell. Ich brauche nur zwei Fragen: ob ein Präfix vorhanden ist, und ob ein Wort existiert. Ich brauche nicht alle strings, die aus einem Präfix. Btw, ich zählte die Anzahl der Präfix-Existenz sucht, war es etwa 10.000.. also die binary search Methode wurde langsamer, denn mit dem Kumpel, der ganze Algorithmus beendet in ~60 ms.
  • OK, gut dass du eine Lösung gefunden. Ich fand nie ein Präfix Abfragen, die langsamer war als 1 Millisekunde und der gleichen für die Existenz einer einzigen Zeichenkette, aber vielleicht habe ich eine schnellere Telefon.
  • Performance-Vergleich DAFSA Speicher verbraucht: 16020976 DAFSA (ms) : [100] 0 DAFSA (ms) : [10000] 5 DAFSA (ms) : [1000000] 28 --------------- trie Speicher verbraucht: 12946984 trie (ms) : [100] 0 trie (ms) : [10000] 6 trie (ms) : [1000000] 131 --------------- Liste belegter Speicher: 1761728 Liste (ms) : [100] 23 Liste (ms) : [10000] 696 Liste (ms) : [1000000] 71752 --------------- Set memory verbraucht: 2341616 Set (ms) : [100] 0 (ms) : [10000] 1 Satz (ms) : [1000000] 22

InformationsquelleAutor Bruce | 2013-09-23
Schreibe einen Kommentar