Basis-Sorte

In der Informatik ist Basis-Sorte ein nichtvergleichender Sortieren-Algorithmus der ganzen Zahl, dass Sorte-Daten mit Schlüsseln der ganzen Zahl durch die Gruppierung von Schlüsseln durch die individuellen Ziffern, die dieselbe bedeutende Position und Wert teilen. Eine Stellungsnotation ist erforderlich, aber weil ganze Zahlen Reihen von Charakteren (z.B, Namen oder Daten) und besonders formatierte Schwimmpunkt-Zahlen vertreten können, wird Basis-Sorte auf ganze Zahlen nicht beschränkt. Basis-Sorte geht so weit 1887 auf die Arbeit von Herman Hollerith beim Tabellieren von Maschinen zurück.

Die meisten Digitalcomputer vertreten innerlich alle ihre Daten als elektronische Darstellungen von Binärzahlen, so Verarbeitung der Ziffern von Darstellungen der ganzen Zahl durch Gruppen von binären Ziffer-Darstellungen ist am günstigsten. Zwei Klassifikationen von Basis-Sorten sind Basis-Sorten der kleinsten positiven Ziffer (LSD) und Basis-Sorten des grössten Teiles der positiven Ziffer (MSD). LSD-Basis-Sorten bearbeiten die Darstellungen der ganzen Zahl, die von kleinster positiver Ziffer anfangen, und gehen an den grössten Teil der positiven Ziffer heran. MSD Basis-Sorten arbeiten der andere Weg ringsherum.

Die Darstellungen der ganzen Zahl, die durch das Sortieren von Algorithmen bearbeitet werden, werden häufig "Schlüssel" genannt, die alle durch sich bestehen oder mit anderen Daten vereinigt werden können. LSD-Basis-Sorten verwenden normalerweise die folgende Sortieren-Ordnung: Kurze Schlüssel kommen, bevor längere Schlüssel und Schlüssel derselben Länge lexikografisch sortiert werden. Das fällt mit der normalen Ordnung von Darstellungen der ganzen Zahl, wie die Folge 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 zusammen. MSD Basis-Sorten verwenden lexikografische Ordnung, die passend ist, um Schnuren, wie Wörter oder Darstellungen der ganzen Zahl der festen Länge zu sortieren. Eine Folge solcher als "b, c, d, e, f, g, h, würde ich, j, ba" als "b, ba, c, d, e, f, g, h, ich, j" lexikografisch sortiert. Wenn lexikografische Einrichtung an Sorte-Darstellungen der ganzen Zahl der variablen Länge gewöhnt ist, dann würden die Darstellungen der Zahlen von 1 bis 10 Produktion als 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 sein, als ob die kürzeren Schlüssel nach links gerechtfertigt und rechts mit leeren Charakteren ausgepolstert wurden, um die kürzeren Schlüssel so lange der längste Schlüssel zum Zweck zu machen, sortierte Ordnung zu bestimmen.

Leistungsfähigkeit

Basis-Sorte-Leistungsfähigkeit ist O (k · n) für n Schlüssel, die k oder weniger Ziffern haben. Manchmal wird k als eine Konstante präsentiert, die Basis-Sorte besser (für genug großen n) machen würde als die besten Vergleich-basierten Sortieren-Algorithmen, die der ganze O sind (n · Klotz (n)). Jedoch, in allgemeinem k kann als keine Konstante betrachtet werden. Insbesondere unter dem allgemeinen (aber manchmal implizit) muss Annahme, dass alle Schlüssel, dann k verschieden sind, mindestens der Ordnung des Klotzes (n) sein, auf keine besseren Ergebnisse hinauslaufend, als andere Sorten.

Kleinste Basis-Sorten der positiven Ziffer

Eine Basis-Sorte der kleinsten positiven Ziffer (LSD) ist ein schneller stabiler Sortieren-Algorithmus, der an Sorte-Schlüssel in der Darstellungsordnung der ganzen Zahl gewöhnt sein kann. Schlüssel können eine Reihe von Charakteren oder numerische Ziffern in einer gegebenen 'Basis' sein. Die Verarbeitung der Schlüssel beginnt an kleinster positiver Ziffer (d. h., die niedrigstwertige Ziffer), und geht zum grössten Teil der positiven Ziffer (d. h., die leftmost Ziffer) weiter. Die Folge, in der Ziffern durch eine LSD-Basis-Sorte bearbeitet werden, ist das Gegenteil der Folge, in der Ziffern durch eine Basis-Sorte des grössten Teiles der positiven Ziffer (MSD) bearbeitet werden.

Eine LSD-Basis-Sorte bedient in O (nk) Zeit, wo n die Zahl von Schlüsseln ist, und k die durchschnittliche Schlüssellänge ist. Diese Art der Leistung für Schlüssel der variablen Länge kann durch die Gruppierung von allen Schlüsseln erreicht werden, die dieselbe Länge zusammen und getrennt das Durchführen einer LSD-Basis-Sorte auf jeder Gruppe von Schlüsseln für jede Länge vom kürzesten bis längsten haben, um zu vermeiden, die ganze Liste von Schlüsseln auf jedem Sortieren-Pass zu bearbeiten.

Ein Basis-Sortieren-Algorithmus wurde ursprünglich verwendet, um geschlagene Karten in mehreren Pässen zu sortieren. Ein Computeralgorithmus wurde für die Basis-Sorte 1954 an MIT von Harold H. Seward erfunden. In vielen großen Anwendungen, die Geschwindigkeit brauchen, ist die Computerbasis-Sorte eine Verbesserung auf (langsameren) Vergleich-Sorten.

LSD-Basis-Sorten sind als eine Alternative zur hohen Leistung Vergleich-basierte Sortieren-Algorithmen wiederaufgetaucht (wie heapsort und mergesort), die Ω verlangen (n · loggen Sie n) Vergleiche, wo n die Zahl von zu sortierenden Sachen ist. Vergleich-Sorten können nicht besser tun als Ω (n · loggen Sie n) Ausführungszeit, aber Angebot die Flexibilität des im Stande Seins, in Bezug auf die mehr komplizierte Einrichtung zu sortieren, als eine lexikografische; jedoch ist diese Fähigkeit von wenig Wichtigkeit in vielen praktischen Anwendungen.

Definition

In jeden Schlüssel wird zuerst ein Niveau von Eimern entsprechend dem Wert der niedrigstwertigen Ziffer bildlich hereingeschaut. Jeder Eimer bewahrt die ursprüngliche Ordnung der Schlüssel, weil die Schlüssel in den Eimer fallen gelassen sind. Es gibt eine isomorphe Ähnlichkeit zwischen der Zahl von Eimern und der Zahl von Werten, die durch eine Ziffer vertreten werden können. Dann die Prozess-Wiederholungen mit der folgenden benachbarten Ziffer bis gibt es keine Ziffern mehr, um in einer Prozession zu gehen. Mit anderen Worten:

  1. Nehmen Sie kleinste positive Ziffer (oder Gruppe von Bit, beider, Beispiele von Basen seiend), von jedem Schlüssel.
  2. Gruppieren Sie die Schlüssel, die auf dieser Ziffer gestützt sind, aber behalten Sie sonst die ursprüngliche Ordnung von Schlüsseln. (Das ist, was die LSD-Basis eine stabile Sorte sortieren lässt).
  3. Wiederholen Sie den sich gruppierenden Prozess mit jedem mehr positive Ziffer.

Die Sorte im Schritt 2 wird gewöhnlich mit der Eimer-Sorte getan oder Sorte aufzählend, die in diesem Fall effizient sind, da es gewöhnlich nur eine kleine Zahl von Ziffern gibt.

Ein Beispiel

Ursprüngliche, unsortierte Liste:

:170, 45, 75, 90, 802, 24, 2, 66

Das Sortieren durch kleinste positive Ziffer (1. Platz) gibt:

:17, 9, 80, 2, 4, 7, 6

Bemerken Sie, dass wir 802 vorher 2 behalten, weil 802 vorher 2 in der ursprünglichen Liste, und ähnlich für Paare 170 & 90 und 45 & 75 vorgekommen ist. Das Sortieren durch die folgende Ziffer (Platz der 10er Jahre) gibt:

:82, 2, 4, 5, 6, 10, 5, 0

Bemerken Sie, dass 802 wieder kommt, vorher 2 als 802 kommt vorher 2 in der vorherigen Liste. Das Sortieren durch den grössten Teil der positiven Ziffer (100s Platz) gibt:

:2, 24, 45, 66, 75, 90, 70, 02

Es ist wichtig zu begreifen, dass jeder der obengenannten Schritte gerade einen einzelnen Pass über die Daten verlangt, da jeder Artikel in seinen richtigen Eimer gelegt werden kann, ohne im Vergleich zu anderen Sachen sein zu müssen.

Einige LSD-Basis-Sorte-Durchführungen teilen Raum für Eimer durch das erste Zählen der Zahl von Schlüsseln zu, die in jedem Eimer vor bewegenden Schlüsseln in jene Eimer gehören. Die Zahl von Zeiten, dass jede Ziffer vorkommt, wird in einer Reihe versorgt. Betrachten Sie die vorherige Liste von auf eine verschiedene Weise als angesehenen Schlüsseln:

:170, 045, 075,090, 002, 024, 802, 066

Das erste Zählen passiert Anfänge auf kleinster positiver Ziffer jedes Schlüssels, eine Reihe von Eimer-Größen erzeugend:

:2 (Eimer-Größe für Ziffern 0: 17, 09)

:2 (Eimer-Größe für Ziffern 2: 00, 80)

:1 (Eimer-Größe für Ziffern 4: 02)

:2 (Eimer-Größe für Ziffern 5: 04, 07)

:1 (Eimer-Größe für Ziffern 6: 06)

Ein zweites Zählen verzichtet auf das folgende mehr positive Ziffer jedes Schlüssels wird eine Reihe von Eimer-Größen erzeugen:

:2 (Eimer-Größe für Ziffern 0: 02, 82)

:1 (Eimer-Größe für Ziffern 2: 04)

:1 (Eimer-Größe für Ziffern 4: 05)

:1 (Eimer-Größe für Ziffern 6: 06)

:2 (Eimer-Größe für Ziffern 7: 10, 05)

:1 (Eimer-Größe für Ziffern 9: 00)

Ein drittes und endgültiges Zählen verzichtet auf den grössten Teil der positiven Ziffer jedes Schlüssels wird eine Reihe von Eimer-Größen erzeugen:

:6 (Eimer-Größe für Ziffern 0: 02, 24, 45, 66, 75, 90)

:1 (Eimer-Größe für Ziffern 1: 70)

:1 (Eimer-Größe für Ziffern 8: 02)

Mindestens eine LSD-Basis-Sorte-Durchführung zählt jetzt die Zahl von Zeiten auf, dass jede Ziffer in jeder Säule für alle Säulen in einem einzelnen zählenden Pass vorkommt. (Sieh die Außenverbindungsabteilung.) Teilen andere LSD-Basis-Sorte-Durchführungen Raum für Eimer dynamisch zu, weil der Raum erforderlich ist.

Wiederholende Versionsverwenden-Warteschlangen

Eine einfache Version einer LSD-Basis-Sorte kann mit Warteschlangen als Eimer erreicht werden.

Der folgende Prozess wird für verschiedene Male gleichen der Länge des längsten Schlüssels wiederholt:

  1. Die ganzen Zahlen werden in eine Reihe von zehn getrennten Warteschlangen eingereiht, die auf ihren Ziffern vom Recht bis linken gestützt sind. Computer vertreten häufig ganze Zahlen innerlich als feste Länge binäre Ziffern. Hier werden wir etwas Analoges mit Dezimalzahl-Ziffern der festen Länge tun. Also, mit den Zahlen vom vorherigen Beispiel würden die Warteschlangen für den 1. Pass sein:
  2. :0: 17, 09
  3. :1: niemand
  4. :2: 00, 80
  5. :3: niemand
  6. :4: 02
  7. :5: 04, 07
  8. :6: 06
  9. :7-9: niemand
  10. Die Warteschlangen werden zurück in eine Reihe von ganzen Zahlen in der zunehmenden Ordnung entfernt. Mit denselben Zahlen wird die Reihe wie das nach dem ersten Pass aussehen:
  11. :170, 090, 002, 802, 024, 045, 075, 066
  12. Für den zweiten Pass:
  13. :Queues:
  14. :: 0: 02, 82
  15. :: 1: niemand
  16. :: 2: 04
  17. :: 3: niemand
  18. :: 4: 05
  19. :: 5: niemand
  20. :: 6: 06
  21. :: 7: 10, 05
  22. :: 8: niemand
  23. :: 9: 00
  24. :Array:
  25. :: 002, 802, 024, 045, 066, 170, 075, 090 (bemerken, dass an diesem Punkt nur 802 und 170 in Unordnung sind)
  26. Für den dritten Pass:
:Queues:
  1. :: 0: 02, 24, 45, 66, 75, 90
  2. :: 1: 70
  3. :: 2-7: niemand
  4. :: 8: 02
  5. :: 9: niemand
:Array:
  1. :: 002, 024, 045, 066, 075, 090, 170, 802 hat (sortiert)

Während das der effizienteste Basis-Sorte-Algorithmus nicht sein kann, ist es relativ einfach, und noch ziemlich effizient.

Beispiel in C ++

einschließen einschließen einschließen einschließen

typedef std:: Vektor

Leere radix_sort (input_type & x)

{\

wenn (x.empty ) Rückkehr;//mindestens ein Element

typedef std:: Vektor

Buckets_type-Eimer;

buckets.resize (10);//teilen Eimer zu

//um Dezimalzahlen zu sortieren

interne Nummer pow10 = 1;//hält pow10 Mächte 10 (1, 10, 100...)

//finden Sie maximal in der Reihe, um die Hauptschleife unter zu beschränken

input_type:: value_type max = *std:: max_element (x.begin , x.end );

//beginnen Sie Basis-Sorte

für (max! = 0; max / = 10, pow10 * = 10)

{\

//1. Bestimmen Sie, welcher Eimer jedes Element in eingehen sollte

//für jedes Element in 'x':

für (input_type:: const_iterator elem = x.begin ; elem! = x.end ; ++ elem)

{\

//berechnen Sie die Eimer-Zahl:

size_t const bucket_num = (*elem / pow10) % 10;

//fügen Sie das Element zur Liste im Eimer hinzu:

Eimer [bucket_num].push_back (*elem);

}\

//2. Übertragungsergebnisse von Eimern zurück in die Hauptreihe

input_type:: iterator store_pos = x.begin ;

//für jeden Eimer:

für (buckets_type:: Iterator-Eimer = buckets.begin ; Eimer! = buckets.end ; ++ Eimer)

{\

//für jedes Element im Eimer:

für (buckets_type:: value_type:: Const_iterator bucket_elem = Eimer-> beginnen ;

bucket_elem! = Eimer-> Ende ; ++ bucket_elem)

{\

//kopieren Sie das Element in die folgende Position in der Hauptreihe

*store_pos ++ = *bucket_elem;

}\

Eimer-> klar ;//vergessen die Liste des aktuellen Eimers

}\ }\}\

int Hauptsache {\

input_type eingegeben;

//lesen Sie Zahlen vom Standardeingang (Enden mit dem Ende der Datei: ^Z / ^D, oder

//mit einer neuen Linie, die etwas enthält, das es nicht eine Zahl ist)

std:: cout

std:: istream_iterator

wenn (input.end ! = std:: find_if (input.begin , input.end ,

std:: bind1st (std:: equal_to

{\

std:: cerr

radix_sort (eingegeben);

std:: cout std:: cout

Beispiel in der Pythonschlange

Dieses auf der Pythonschlange-Programmiersprache geschriebene Beispiel wird die Basis-Sorte für jede Basis (Basis) 2 oder größer durchführen. Die Einfachheit der Ausstellung wird über die kluge Programmierung gewählt, und so wird die Klotz-Funktion statt Bit-Verschiebungstechniken verwendet.

  1. python2.6

Die meisten Basis-Sorten der positiven Ziffer

Eine Basis-Sorte des grössten Teiles der positiven Ziffer (MSD) kann an Sorte-Schlüssel in der lexikografischen Ordnung gewöhnt sein. Verschieden von einer Basis-Sorte der kleinsten positiven Ziffer (LSD) bewahrt der grösste Teil der Basis-Sorte der positiven Ziffer die ursprüngliche Ordnung von Doppelschlüsseln nicht notwendigerweise. Eine MSD Basis-Sorte fängt an, die Schlüssel vom grössten Teil der positiven Ziffer, leftmost Ziffer, zu kleinster positiver Ziffer, niedrigstwertiger Ziffer zu bearbeiten. Diese Folge ist gegenüber dieser von Basis-Sorten der kleinsten positiven Ziffer (LSD). Eine MSD Basis-Sorte hört auf, die Position eines Schlüssels umzuordnen, wenn die Verarbeitung ein einzigartiges Präfix des Schlüssels erreicht. Einige MSD Basis-Sorten verwenden ein Niveau von Eimern, in denen man die Schlüssel gruppiert. Sieh die Zählen-Sorte und Ablegefach-Sorte-Artikel. Andere MSD Basis-Sorten verwenden vielfache Niveaus von Eimern, die einen trie oder einen Pfad in einem trie bilden. Eine Sorte eines Briefträgers / Postsorte ist eine Art MSD Basis-Sorte.

Recursion

Ein rekursiv Unterteilen MSD Basis-Sorte-Algorithmus arbeitet wie folgt:

  1. Nehmen Sie den grössten Teil der positiven Ziffer jedes Schlüssels.
  2. Sortieren Sie die Liste von auf dieser Ziffer gestützten Elementen, Elemente mit derselben Ziffer in einen Eimer gruppierend.
  3. Rekursiv Sorte jeder Eimer, mit der folgenden Ziffer nach rechts anfangend.
  4. Verketten Sie die Eimer zusammen in der Ordnung.

Durchführung

Eine Zwei-Pässe-Methode kann verwendet werden, um zuerst herauszufinden, wie groß jeder Eimer sein und dann jeden Schlüssel (oder Zeigestock zum Schlüssel) in den passenden Eimer legen muss. Ein System des einzelnen Passes kann auch verwendet werden, wo jeder Eimer dynamisch zugeteilt und wie erforderlich, in der Größe angepasst wird, aber das läuft die Gefahr der ernsten Speicherzersplitterung, discontiguous Zuteilungen des Gedächtnisses, das Leistung erniedrigen kann. Diese Speicherzersplitterung konnte vermieden werden, wenn eine feste Zuteilung von Eimern für alle möglichen Werte einer Ziffer verwendet wird, aber, für eine 8-Bit-Ziffer, würde das 256 (2) Eimer verlangen, selbst wenn nicht alle Eimer verwendet würden. Also, diese Annäherung könnte das ganze verfügbare Gedächtnis schnell verbrauchen und in Paginierungsraum eintreten, wo Daten versorgt und auf einer Festplatte oder einem anderen sekundären Speichergerät statt des Hauptgedächtnisses zugegriffen werden, das Leistung radikal erniedrigen würde. Eine feste Zuteilungsannäherung würde nur Sinn haben, wenn jede Ziffer wie ein einzelnes Bit sehr klein wäre.

Rekursives Vorwärtsbasis-Sorte-Beispiel

Sortieren Sie die Liste:

170, 045, 075, 090, 002, 024, 802, 066

  1. Das Sortieren durch den grössten Teil der positiven Ziffer (100s Platz) gibt: Null Hunderte Eimer: 45, 75, 90, 02, 24, 66 Ein hundert Eimer: 70 Acht hundert Eimer: 02
  2. Das Sortieren durch die folgende Ziffer (Platz der 10er Jahre) ist nur für jene Zahlen in der Null Hunderte Eimer erforderlich (keine anderen Eimer enthalten mehr als einen Artikel): Nullzehnen-Eimer: 02 Eimer der zwanziger Jahre: 04 Eimer der vierziger Jahre: 05 Eimer der sechziger Jahre: 06 Eimer der siebziger Jahre: 05 Eimer der neunziger Jahre: 00
  3. Das Sortieren durch kleinste positive Ziffer (1s Platz) ist nicht erforderlich, weil es keinen Zehnen-Eimer mit mehr als einer Zahl gibt. Deshalb wird die jetzt sortierte Null Hunderte Eimer verkettet, Folge, mit dem einem hundert Eimer und acht hundert Eimer zu give:002, 024, 045, 066, 075, 090, 170, 802 angeschlossen

Dieses Beispiel hat Basis zehn Ziffern wegen der Lesbarkeit verwendet, aber natürlich könnten binäre Ziffern oder vielleicht Bytes mehr Sinn für einen binären Computer haben in einer Prozession zu gehen.

MSD Basis-Sorte-Durchführungen im Platz

Binäre MSD Basis-Sorte, auch genannt binäre Schnellsortierung, kann im Platz durch das Aufspalten der Eingangsreihe in zwei Behälter - der 0's Behälter und 1's Behälter durchgeführt werden. Der 0's Behälter wird vom Anfang der Reihe angebaut, wohingegen 1's Behälter vom Ende der Reihe angebaut wird. Die 0's Behälter-Grenze wird vor dem ersten Reihe-Element gelegt. 1's wird Behälter-Grenze nach dem letzten Reihe-Element gelegt. Das bedeutendste Bit des ersten Reihe-Elements wird untersucht. Wenn dieses Bit 1 ist, dann wird das erste Element mit dem Element vor 1's Behälter-Grenze (das letzte Element der Reihe), und 1's getauscht Behälter wird durch ein Element durch decrementing 1's Grenzreihe-Index angebaut. Wenn dieses Bit 0 ist, dann bleibt das erste Element an seiner aktuellen Position, und der 0's Behälter wird durch ein Element angebaut. Das folgende untersuchte Reihe-Element ist dasjenige vor der 0's Behälter-Grenze (d. h. das erste Element, das nicht im 0's Behälter oder 1's Behälter ist). Dieser Prozess geht weiter, bis der 0's Behälter und 1's Behälter einander erreicht. Der 0's Behälter und 1's Behälter wird dann rekursiv gestützt auf dem folgenden Bit jedes Reihe-Elements sortiert. Rekursive Verarbeitung geht weiter, bis das am wenigsten bedeutende Bit für das Sortieren verwendet worden ist. Das Berühren von unterzeichneten ganzen Zahlen verlangt das Behandeln des bedeutendsten Bit mit dem entgegengesetzten Sinn, der von der nicht unterzeichneten Behandlung des Rests der Bit gefolgt ist.

MSD Sorte der binären Basis im Platz kann zur größeren Basis erweitert werden und Fähigkeit im Platz behalten. Das Aufzählen der Sorte wird verwendet, um die Größe jedes Behälters und ihres Startindex zu bestimmen. Das Tauschen wird verwendet, um das aktuelle Element in seinen Behälter zu legen, der durch die Erweiterung der Behälter-Grenze gefolgt ist. Da die Reihe-Elemente gescannt werden, werden die Behälter ausgelassen, und nur Elemente zwischen Behältern werden bearbeitet, bis die komplette Reihe bearbeitet worden ist und alle Elemente in ihren jeweiligen Behältern enden. Die Zahl von Behältern ist dasselbe als die Basis verwendet - z.B 16 Behälter für den 16-Basen-. Jeder Pass basiert auf einer einzelnen Ziffer (z.B 4 Bit pro Ziffer im Fall vom 16-Basen-), vom grössten Teil der positiven Ziffer anfangend. Jeder Behälter wird dann rekursiv mit der folgenden Ziffer bearbeitet, bis alle Ziffern für das Sortieren verwendet worden sind.

Sorte der binären Basis im Platz und n-bit-radix Sorte, die in Paragrafen oben besprochen ist, sind beide nicht stabile Algorithmen.

Stabile MSD Basis-Sorte-Durchführungen

MSD Basis-Sorte kann als ein stabiler Algorithmus durchgeführt werden, aber verlangt den Gebrauch eines Speicherpuffers derselben Größe wie die Eingangsreihe. Dieses Extragedächtnis erlaubt dem Eingangspuffer, vom ersten Reihe-Element gescannt zu werden, um zu dauern, und die Reihe-Elemente zu den Bestimmungsort-Behältern in derselben Ordnung zu bewegen. So werden gleiche Elemente in den Speicherpuffer in derselben Ordnung gelegt sie waren in der Eingangsreihe. Der MSD-basierte Algorithmus verwendet den Extraspeicherpuffer als die Produktion auf dem ersten Niveau von recursion, aber tauscht den Eingang und die Produktion auf dem folgenden Niveau von recursion, um die Gemeinkosten zu vermeiden, das Produktionsergebnis zurück zum Eingangspuffer zu kopieren. Jeder der Behälter wird rekursiv bearbeitet, wie für die MSD Basis-Sorte im Platz getan wird. Nachdem die Sorte durch die letzte Ziffer vollendet worden ist, wird der Produktionspuffer überprüft, um zu sehen, ob es die ursprüngliche Eingangsreihe ist, und wenn es nicht ist, dann wird eine einzelne Kopie durchgeführt. Wenn die Ziffer-Größe solch gewählt wird, dass die durch die Ziffer-Größe geteilte Schlüsselgröße eine gerade Zahl ist, wird die Kopie am Ende vermieden.

Hybride Annäherungen

Basis-Sorte, wie zwei Pass-Methode, wo das Aufzählen der Sorte während des ersten Passes jedes Niveaus von recursion verwendet wird, hat eine große Konstante oben. So, wenn die Behälter klein werden, sollten andere Sortieren-Algorithmen wie Einfügungssorte verwendet werden. Eine gute Durchführung der Einfügungssorte ist für die kleine Reihe schnell, im Platz stabil, und kann Basis-Sorte bedeutsam beschleunigen.

Anwendung, um Computerwissenschaft anzupassen

Bemerken Sie, dass dieser rekursive Sortieren-Algorithmus besondere Anwendung hat, um Computerwissenschaft anzupassen, weil jeder der Behälter unabhängig sortiert werden kann. In diesem Fall wird jeder Behälter zum folgenden verfügbaren Verarbeiter passiert. Ein einzelner Verarbeiter würde am Anfang (der grösste Teil der positiven Ziffer) verwendet. Dann, durch die zweite oder dritte Ziffer, würden alle verfügbaren Verarbeiter wahrscheinlich beschäftigt sein. Ideal, weil jede Unterteilung völlig sortiert wird, würden weniger und weniger Verarbeiter verwertet. Im Grenzfall werden alle Schlüssel identisch oder fast zu einander mit dem Ergebnis identisch sein, dass es wenig zu keinem Vorteil für das Verwenden der Parallele geben wird, die rechnet, um die Schlüssel zu sortieren.

Im Spitzenniveau von recursion ist die Gelegenheit für den Parallelismus im zählenden Sorte-Teil des Algorithmus. Das Zählen ist hoch parallel, dem parallel_reduce Muster zugänglich, und spaltet die Arbeit gut über vielfache Kerne bis zur reichenden Speicherbandbreite-Grenze. Dieser Teil des Algorithmus hat datenunabhängigen Parallelismus. Die Verarbeitung jedes Behälters in nachfolgenden recursion Niveaus ist jedoch datenabhängig. Zum Beispiel, wenn alle Schlüssel von derselben Wichtigkeit wären, dann würde es nur einen einzelnen Behälter mit irgendwelchen Elementen darin geben, und kein Parallelismus würde verfügbar sein. Für zufällige Eingänge würden alle Behälter nahe ebenso bevölkert sein, und ein großer Betrag der Parallelismus-Gelegenheit würde verfügbar sein.

Bemerken Sie, dass dort schneller verfügbare Algorithmen sortieren, zum Beispiel ist optimale Kompliziertheit O (Klotz (n)) diejenigen der Drei Ungarn und Richard Coles, und der bitonic von Batcher hat mergesort eine algorithmische Kompliziertheit von O (Klotz (n)), von denen alle eine niedrigere algorithmische Zeitkompliziertheit zur Basis-Sorte auf einem MANNSCHAFT-PRAHM haben. Die schnellsten bekannten PRAHM-Sorten wurden 1991 von David Powers mit einer parallelized Schnellsortierung beschrieben, die in O (Klotz (n)) Zeit auf einem CRCW-PRAHM mit n Verarbeitern durch das Durchführen verteilend implizit, sowie einem radixsort bedienen kann, der das Verwenden desselben Tricks in O (k) bedient, wo k das Maximum keylength ist. Jedoch, keiner die PRAHM-Architektur oder ein einzelner folgender Verarbeiter können wirklich in einem Weg gebaut werden, der ohne die Zahl von unveränderlichen fanout Tor-Verzögerungen pro Zyklus klettern wird, der als O (Klotz (n)) zunimmt, so dass tatsächlich eine pipelined Version des bitonic von Batcher mergesort und des O (Klotz (n)) PRAHM-Sorten der ganze O (Klotz (n)) in Bezug auf Uhr-Zyklen mit Powers sind, der zugibt, dass Batcher niedrigere Konstante in Bezug auf Tor-Verzögerungen haben würde als sein Parallel Quicksort und Radixsort oder der Mergesort von Cole, für ein keylength-unabhängiges Sortieren-Netz von O (nlog (n)).

Zusätzliche mit Sitz in trie Basis-Sorte

Eine andere Weise, mit einer MSD Basis-Sorte fortzufahren, soll mehr Gedächtnis verwenden, um einen trie zu schaffen, um die Schlüssel zu vertreten und dann den trie zu überqueren, um jeden Schlüssel in der Ordnung zu besuchen. Eine Tiefe das erste Traversal eines trie, der vom Wurzelknoten anfängt, wird jeden Schlüssel in der Ordnung besuchen. Eine Tiefe das erste Traversal eines trie oder jede andere Art der acyclic Baumstruktur, ist zum Überqueren eines Irrgartens über die rechte Regel gleichwertig.

Ein trie vertritt im Wesentlichen eine Reihe von Schnuren oder Zahlen, und eine Basis-Sorte, die eine trie Struktur verwendet, ist nicht notwendigerweise stabil, was bedeutet, dass die ursprüngliche Ordnung von Doppelschlüsseln nicht notwendigerweise bewahrt wird, weil ein Satz Doppelelemente nicht enthält. Zusatzinformation wird mit jedem Schlüssel vereinigt werden müssen, die Bevölkerungszählung oder ursprüngliche Ordnung irgendwelcher Doppelschlüssel in einer mit Sitz in trie Basis-Sorte anzuzeigen, wenn das Nachgehen dieser Information für eine besondere Anwendung wichtig ist. Es kann sogar wünschenswert sein, irgendwelche Doppelschnuren zu verwerfen, als die trie Entwicklung weitergeht, wenn die Absicht ist, nur einzigartige Schnuren in der sortierten Ordnung zu finden. Einige Menschen sortieren eine Liste von Schnuren zuerst und lassen dann einen getrennten die sortierte Liste durchführen, um Doppelschnuren zu verwerfen, die langsamer sein als das Verwenden eines trie zu gleichzeitig der Sorte und Doppelschnuren in einem Pass verwerfen können.

Einer der Vorteile, die trie Struktur aufrechtzuerhalten, ist, dass der trie es möglich macht, schnell zu bestimmen, wenn ein besonderer Schlüssel ein Mitglied des Satzes von Schlüsseln in einer Zeit ist, die zur Länge des Schlüssels, k, in O (k) Zeit proportional ist, die der Gesamtzahl von Schlüsseln unabhängig ist. Die Bestimmung der Satz-Mitgliedschaft in einer einfachen Liste, im Vergleich mit der Bestimmung der Satz-Mitgliedschaft in einem trie, verlangt binäre Suche, O (k log (n)) Zeit; geradlinige Suche, O (kn) Zeit; oder eine andere Methode, deren Ausführungszeit irgendwie auf der Gesamtzahl, n aller Schlüssel im Grenzfall ist. Es ist manchmal möglich, Satz-Mitgliedschaft in einer einfachen Liste in O (k) Zeit in einer Zeit zu bestimmen, die der Gesamtzahl von Schlüsseln, solcher als unabhängig ist, wenn, wie man bekannt, die Liste in einer arithmetischen Folge oder einer anderen berechenbaren Folge ist.

Das Aufrechterhalten der trie Struktur macht es auch möglich, neue Schlüssel in den Satz zusätzlich oder die Löschtasten vom Satz zusätzlich einzufügen, während das Aufrechterhalten Ordnung in O (k) Zeit in einer Zeit sortiert hat, die der Gesamtzahl von Schlüsseln unabhängig ist. Im Gegensatz müssen andere Basis-Sortieren-Algorithmen, im Grenzfall, die komplette Liste von Schlüsseln jedes Mal aufsuchen, dass ein neuer Schlüssel hinzugefügt oder von einer vorhandenen Liste gelöscht wird, O (kn) Zeit verlangend.

Analogie von Schneewittchen

Wenn die Knoten durch Gänge verbundene Zimmer waren, dann ist hier, wie Schneewittchen fortfahren könnte, das ganze Überragen zu besuchen, wenn der Platz dunkel war, ihre rechte Hand auf einer Wand zu jeder Zeit behaltend:

  1. Sie reist unten Saal B, um Schüchtern zu finden.
  2. Sie setzt fort, mit ihrer rechten Hand auf der Wand voranzukommen, die sie um das Zimmer nimmt und unterstützen Sie Saal B.
  3. Sie lässt Säle D, O, und C herunter, um Doc zu finden.
  4. Fortsetzend, der Wand mit ihrer rechten Hand zu folgen, geht sie Saal C, dann unten Saal P zurück, wo sie Doof findet.
  5. Sie macht weiter unterstützen Säle P, O, D, und kommt dann Saal G herunter, um Mürrisch zu finden.
  6. Sie geht Saal G mit ihrer rechten Hand noch auf der Wand zurück und geht hinunter Saal H zum Zimmer, ist wo Glücklich.
  7. Sie reist unterstützen Saal H, und biegt unten Säle S und L nach rechts ab, wo sie Schläfrig findet.
  8. Sie geht Saal L, unten Saal N zurück, wo sie schließlich Sneezy findet.
  9. Sie reist unterstützen Säle N und S zu ihrem Startpunkt, und weiß, dass sie getan wird.

Diese Reihen von Schritten dienen, um den Pfad zu illustrieren, der im trie von Schneewittchen über eine Tiefe das erste Traversal genommen ist, um das Überragen durch die aufsteigende Reihenfolge ihrer Namen zu besuchen, Schüchtern, der Doktor, Doof, Mürrisch, Glücklich, Schläfrig, und Sneezy. Der Algorithmus, um etwas Operation auf den Daten durchzuführen, die mit jedem Knoten eines Baums zuerst, wie Druck der Daten und dann in den Baum tiefere das Bewegen vereinigt sind, wird ein Vorordnungstraversal genannt, das eine Art Tiefe das erste Traversal ist. Ein Vorordnungstraversal wird verwendet, um den Inhalt eines trie in aufsteigender Reihenfolge zu bearbeiten. Wenn Schneewittchen das Überragen durch die hinuntersteigende Ordnung ihrer Namen hat besuchen wollen, dann konnte sie rückwärts gehen, während sie der Wand mit ihrer rechten Hand gefolgt ist, oder wechselweise vorwärts spazieren zu gehen, während sie der Wand mit ihrer linken Hand gefolgt ist. Der Algorithmus, um sich tiefer in einen Baum zuerst bis zu keinem weiteren Abstieg zu verlassenen Knoten zu bewegen, ist möglich und dann leistend etwas Operation auf den mit jedem Knoten vereinigten Daten wird Postordnungstraversal genannt, das eine andere Art der Tiefe das erste Traversal ist. Ein Postordnungstraversal wird verwendet, um den Inhalt eines trie in der hinuntersteigenden Ordnung zu bearbeiten.

Der Wurzelknoten des trie im Diagramm vertritt im Wesentlichen eine ungültige Schnur, eine leere Schnur, die nützlich sein kann, um die Zahl von leeren Linien in einer Liste von Wörtern nachzugehen. Die ungültige Schnur kann mit einer kreisförmig verbundenen Liste mit der ungültigen Schnur am Anfang als sein einziges Mitglied, mit dem nachschicken und den rückwärts gerichteten Zeigestöcken beide vereinigt werden, am Anfang zur ungültigen Schnur hinweisend. Die kreisförmig verbundene Liste kann dann ausgebreitet werden, weil jeder neue Schlüssel in den trie eingefügt wird. Die kreisförmig verbundene Liste wird im folgenden Diagramm als dick, grau, horizontal verbundene Linien vertreten:

Wenn ein neuer Schlüssel, außer der ungültigen Schnur, in einen Blatt-Knoten des trie eingefügt wird, dann kann der Computer zum letzten vorhergehenden Knoten gehen, wo es einen Schlüssel oder eine Gabelung gab, um eine Tiefensuche durchzuführen, um den lexikografischen Nachfolger oder Vorgänger des eingefügten Schlüssels zum Zweck zu finden, den neuen Schlüssel in die kreisförmig verbundene Liste zu spleißen. Der letzte vorhergehende Knoten, wo es einen Schlüssel oder eine Gabelung, eine Gabel im Pfad gab, ist ein Elternteilknoten im Typ von trie gezeigt hier, wo nur einzigartige Schnur-Präfixe als Pfade im trie vertreten werden. Wenn es bereits einen Schlüssel gibt, der mit dem Elternteilknoten vereinigt ist, der während einer Bewegung weg von der Wurzel während eines rechten, Vorwärts-bewegenden, Tiefe das erste Traversal besucht worden sein würde, dann beendet das sofort die Tiefensuche, weil dieser Schlüssel der Vorgänger des eingefügten Schlüssels ist. Zum Beispiel, wird wenn Schüchtern, in den trie eingefügt, dann ist der Vorgänger die ungültige Schnur im Elternteilknoten, der der Wurzelknoten in diesem Fall ist. Mit anderen Worten, wenn der Schlüssel, der eingefügt wird, auf dem leftmost Zweig des Elternteilknotens ist, dann ist jede im Elternteilknoten enthaltene Schnur der lexikografische Vorgänger des Schlüssels, der eingefügt wird, sonst besteht der lexikografische Vorgänger des Schlüssels, der eingefügt wird, unten der Zweig des Elternteilknotens, der sofort links vom Zweig ist, wo der neue Schlüssel eingefügt wird. Zum Beispiel, waren wenn Mürrisch, der letzte in den trie eingefügte Schlüssel, dann würde der Computer eine Wahl des Versuchens haben, entweder den Vorgänger, Doof, oder den Nachfolger, Glücklich mit einer Tiefensuche zu finden, die vom Elternteilknoten von Mürrischen anfängt. Ohne Zusatzinformation, um anzuzeigen, welcher Pfad länger ist, könnte der Computer den längeren Pfad, D, O, P überqueren. Wenn Doof, waren der letzte in den trie eingefügte Schlüssel, dann sucht die Tiefe - zuerst das Starten vom Elternteilknoten von Doofen würde bald den Vorgänger, "den Doktor" finden, weil das die einzige Wahl sein würde.

Wenn ein neuer Schlüssel in einen inneren Knoten eingefügt wird, dann kann eine Tiefensuche vom inneren Knoten angefangen werden, um den lexikografischen Nachfolger zu finden. Zum Beispiel, wenn die wörtliche Schnur "TUT", wurden in den Knoten am Ende des Pfads D, O eingefügt, dann konnte eine Tiefensuche von diesem inneren Knoten angefangen werden, um den Nachfolger, "den DOKTOR" zum Zweck zu finden, die neue Schnur in die kreisförmig verbundene Liste zu spleißen.

Das Formen der kreisförmig verbundenen Liste verlangt mehr Gedächtnis, aber erlaubt den Schlüsseln, mehr direkt entweder im Steigen oder in der hinuntersteigenden Ordnung über ein geradliniges Traversal der verbundenen Liste aber nicht einer Tiefe das erste Traversal des kompletten trie besucht zu werden. Dieses Konzept einer kreisförmig verbundenen trie Struktur ist dem Konzept eines binären Gewindebaums ähnlich. Diese Struktur wird einen kreisförmig Gewindetrie genannt.

Wenn ein trie an Sorte-Zahlen gewöhnt ist, müssen die Zahl-Darstellungen alle dieselbe Länge sein, wenn Sie nicht bereit sind, eine Breite das erste Traversal durchzuführen. Wenn die Zahl-Darstellungen über die Tiefe das erste Traversal besucht werden, wie im obengenannten Diagramm die Zahl-Darstellungen immer auf den Blatt-Knoten des trie sein werden. Bemerken Sie, wie ähnlich im Konzept dieses besondere Beispiel eines trie zum rekursiven Vorwärtsbasis-Sorte-Beispiel ist, das den Gebrauch von Eimern statt eines trie einschließt. Das Durchführen einer Basis-Sorte mit den Eimern ist dem Schaffen eines trie und dann der Verschrottung der Nichtblatt-Knoten ähnlich.

Siehe auch

  • Reihe-Karte-Sortierer von IBM 80
  • Spaghetti-Sorte

Links


Source is a modification of the Wikipedia article Radix sort, licensed under CC-BY-SA. Full list of contributors here.
Reversi / Tauziehen
Impressum & Datenschutz