2012-04-07 10 views
-1

Ich muss Listen von über 100.000 Wörtern lexikografisch zusammenführen und sortieren. Ich mache es derzeit mit einer leicht modifizierten Blasensortierung, aber bei O (n^2) dauert es eine ganze Weile. Gibt es schnellere Algorithmen zum Sortieren von Wortlisten? Ich benutze Python, aber wenn es eine Sprache gibt, die damit besser umgehen kann, bin ich offen für Vorschläge.Lexikografische Sortierung der Wortliste

+3

jede Art tun würde. – soulcheck

+0

* In-place, das ist, wenn der Speicher eingeschränkt ist – soulcheck

Antwort

7

Alle O(nlogn)sorting algorithm tun wird es wahrscheinlich besser, dann Blase Art, aber sie werden O(nlogn * |S|)

jedoch sein, kann das Sortieren Strings in O(n*|S|) geschehen, wo |S| die Länge der durchschnittlichen String, eine trie verwendet, und ein einfach DFS.

High-Level-Pseudocode:

1. create a trie from your collection. 
2. do a DFS on the trie generated, and add each string 
    to the list when you reach terminal node. 
+0

Kennen Sie gute (effiziente) Trie-Implementierungen in Python? – Cameron

+0

@Cameron: Ich bin nicht wirklich ein nativer Python-Benutzer, also nicht. Aber ich glaube, dass es existiert, es ist viel zu häufig, und Python ist viel zu weit verbreitet, um zu glauben, dass es dafür keine Open-Source-Implementierung gibt. – amit

11

Verwenden Sie die integrierte in sort() Liste Methode:

>>> words = [ 'baloney', 'aardvark' ] 
>>> words.sort() 
>>> print words 
['aardvark', 'baloney'] 

Es verwendet eine O(n lg(n)) Art , die Timsort (.., Die eine merge-Art geändert wird, ich glaube, es ist sehr für die Geschwindigkeit abgestimmt) .


Wie bereits in den Kommentaren out, dies auf die Anzahl der Elementvergleiche Bezug nimmt, nicht auf die Anzahl von Low-Level-Operationen. Da die Elemente in diesem Fall Zeichenfolgen sind und der Vergleich von zwei Zeichenfolgen min{|S1|, |S2|} Zeichenvergleiche erfordert, ist die Gesamtkomplexität O(n lg(n) * |S|), wobei |S| die Länge der längsten Zeichenfolge ist, die sortiert wird. Dies gilt jedoch für alle Vergleichssorten. Die tatsächliche Anzahl der Operationen hängt von den Kosten der Elementvergleichsfunktion für die Art der zu sortierenden Elemente ab. Da alle Vergleichsarten die gleiche Vergleichsfunktion verwenden, können Sie diese Feinheit ignorieren, wenn Sie die algorithmische Komplexität dieser Sorten untereinander vergleichen.

+1

irgendwelche Vergleiche Sortieralgorithmen sind 'O (nlogn * | S |)' für Strings, da jeder Vergleich op ist nicht 'O (1) ' – amit

+0

@it: True, obwohl '| S |' ist im Allgemeinen ziemlich klein im Vergleich zu 'n' für Wörter. Versuche sind großartig, aber sie (effizient) zu konstruieren ist schwierig, während 'sort()' eine eingebaute ist. – Cameron

+0

@amit: sie müssen nicht sein; String-Gleichheitstests können in 'O (1)' Zeit durchgeführt werden, wenn die Sprache String-Interning durchführt. – ninjagecko

Verwandte Themen