Algorithms & Data Structures Digital Sorting WS B. Anzengruber-Tanase (Institute for Pervasive Computing, JKU Linz) (Institute for Pervasive Computing, JKU Linz)
WIEDERHOLUNG :: UNTERE SCHRANKE FÜR SORTIEREN DURCH VERGLEICHEN Algorithmus Worst Case Best Case Avg. Case BubbleSort O(N ) O(N) O(N ) InsertionSort O(N ) O(N) O(N ) SelectionSort O(N ) O(N ) O(N ) HeapSort O(N log N) O(N log N) O(N log N) MergeSort O(N log N) O(N log N) O(N log N) QuickSort O(N ) O(N log N) O(N log N) Algorithms & Datastructures // W //
WEITERE SORTIERSTRATEGIEN Bisher: Schlüsselvergleiche um die korrekte Ordnung der Elemente herzustellen O (N log N) als untere Schranke Andere Strategie: nicht den vollständigen Schlüssel bei jedem Schritt betrachten und verarbeiten. Analogie: wenn man die Nummer in einem Telefonbuch sucht, werden oftmals nur die ersten Buchstaben des Namens betrachtet, um die Seite mit dem gewünschten Eintrag zu finden. Schlüssel zerlegen in eine Folge von festen Bestandteilen (Bits/Bytes) Binärzahlen sind Bitfolgen, Strings sind Zeichenfolgen, Dezimalzahlen sind Ziffernfolgen, etc. Schlüssel sind Wörter über einem aus m Elementen bestehenden Alphabet, z.b.: m = Schlüssel sind Dezimalzahlen m =.. Schlüssel sind Binärzahlen m = Schlüssel sind Wörter über dem Alphabet {a,, z} Man kann die Schlüssel also als m-adische Zahlen auffassen. Daher nennt man m auch die Wurzel (lat.: Radix) der Darstellung. Algorithms & Datastructures // W // 3
WEITERE SORTIERSTRATEGIEN Sortierverfahren, die Schlüssel Stück für Stück verarbeiten, heißen RadixSort-Verfahren. Sie vergleichen Schlüssel nicht einfach, sondernd verarbeiten und vergleichen Teile von Schlüsseln. Methodik: Extrahiere die i-te Ziffer aus einem Schlüssel Vorraussetzung: Funktion z m (i, k) die für einen Schlüssel k die Ziffer mit Gewicht m i in der m-adischen Darstellung von k (also die i-te Ziffer von rechts) liefert, z.b.: z (, ) = z (, ) = z (, ) = z (, ) = z (, ) = Wenn k eine positive ganze Zahl ist, so erhält man die i-te Ziffer der Darstellung von k zur Basis m mit: Ein Schlüssel ist eine Zahl zur Basis m (m=radix), im Folgenden m= Algorithms & Datastructures // W //
RADIX SORT RadixSort betrachtet die Struktur der Schlüssel Es seien die Schlüssel als Zahl zur Basis m (m=radix) dargestellt Bsp.: m= (Darstellung im Binärsystem) = 3 Gewicht (b=) bit # Sortieren erfolgt auf Basis des Vergleichs der Bits an der selben Position Erweiterung auf Schlüssel, die alphanumerische Zeichenketten sind Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Methode: gegeben ist das nach aufsteigenden Binärschlüsseln (gleicher Länge) zu sortierende Feld a[] a[n] dieses wird in Abhängigkeit des führenden Bits der binären Sortierschlüssel in zwei Teile aufgeteilt Alle Elemente, deren Schlüssel eine führende haben, kommen in die obere/linke Teilfolge, alle Elemente deren Schlüssel eine führende haben, kommen in die untere/rechte Teilfolge Ähnlich zum QuickSort erfolgt diese Aufteilung In-Situ durch Vertauschen Teilfolgen werden rekursiv auf dieselbe Weise sortiert, wobei das nächste Bit von links als führendes Bit betrachtet wird Analyse: Wird für Schlüssel der Länge b+ insgesamt (s b+ -)-mal rekursiv aufgerufen maximale Rekursionstiefe ist b Bearbeitung (z.b.: Aufteilung) pro Rekursionsebene in linearer Zeit Komplexität: O( b N ) Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Untersuche Bits von links nach rechts. Sortiere Array nach Bit an Position links außen. Teile Array 3. Rekursion sortiere oberes Subarray (und ignoriere Bit ganz links außen) sortiere unteres Subarray (und ignoriere Bit ganz links außen) oberes Subarray unteres Subarray Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Wie erfolgt Sortierung? repeat scan top-down to find key starting with ; scan bottom-up to find key starting with ; exchange keys until scan indices cross; scan top-down scan bottom-up scan top-down scan bottom-up. Austauschschritt. Austauschschritt Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W // 3
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) 3 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) unsortiertes Array b- = = = = = = = = 3 = = 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Array sortiert nach Bit links außen b- = = = = = = = = 3 = = 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Array sortiert nach ersten Bits links außen b- = = = = = = = = 3 = = 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Array sortiert nach ersten 3 Bits links außen b- = = = = = = = = 3 = = 3 Algorithms & Datastructures // W // 3
RADIX EXCHANGE SORT (BINÄRER QUICKSORT) Array vollständig sortiert = = = = = = = = 3 = = 3 Algorithms & Datastructures // W //
RADIX EXCHANGE SORT VS. QUICKSORT Gemeinsamkeiten sortieren beide auf Basis von Partition des Arrays rekursive Verfahren Unterschiede Art der Partitionierung: Radix Exchange Sort unterteilt Array nach größer/kleiner als b- Quicksort unterteilt nach größer/kleiner als bestimmtes Element im Array Komplexität: Radix Exchange: O(N b) Quicksort: O(N log N) im Average Case Algorithms & Datastructures // W //
DIREKTER RADIX SORT Untersucht Bits von rechts nach links for k:= to b- sort the array in a stable way, looking only at bit k Unsortiertes Array sortiere nach Sortiertes Array Algorithms & Datastructures // W //
DIREKTER RADIX SORT Erinnere: Ein Sortierverfahren heißt stabil, wenn die anfängliche relative Ordnung der Elemente mit gleichem Schlüssel beibehalten wird Beispiel: betrachte ersten Sortierschritt aus vorangegangenem Beispiel: stabil, da Ordnung innerhalb der Elemente, die mit bzw. enden, beibehalten wird Algorithms & Datastructures // W //
DIREKTER RADIX SORT Beweis, dass Algorithmus korrekt funktioniert zu zeigen: nach Durchführung des Algorithmus sind beliebige zwei Schlüssel in Korrekter relativer Ordnung gegeben: zwei Schlüssel, wobei k die am weitesten links stehende Bitposition ist, an der sich die Schlüssel unterscheiden k Im Schritt k werden die beiden Schlüssel in die richtige relative Reihenfolge gebracht Da das verwendete Sortierverfahren stabil ist, wird diese relative Reihenfolge in den nachfolgenden Schritten nicht mehr verändert Algorithms & Datastructures // W //
DIREKTER RADIX SORT Beispiel zum Beweis der Korrektheit: k Es spielt keine Rolle, in welcher Reihenfolge die Elemente ursprünglich sind Im Sortierschritt k werden sie in korrekte relative Ordnung gebracht Sortieren nach höheren Bits als k zerstört die relative Ordnung nicht mehr, da ein stabiles Sortierverfahren verwendet werden muss Algorithms & Datastructures // W //
DIREKTER RADIX SORT ANALYSE Komplexität for k:= to b- sort the array in a stable way, looking only at bit k Falls ein stabiles Sortierverfahren innerhalb des Schleifenkörpers verwendet wird, so ist die Komplexität O( b N ) Gibt es ein stabiles Sortierverfahren mit O(N)? Bucket Sort! Algorithms & Datastructures // W // 3
BUCKET SORT Stabiles Sortierverfahren für N Zahlen, wobei für jede Zahl n gilt: n {,, 3,..., m} Komplexität: O(N+m) Algorithmus erläutert anhand des Beispiels m=3 und Array (N=) 3 Erzeuge m buckets m=3 Algorithms & Datastructures // W // 3
BUCKET SORT Setze jedes Element des Arrays in passendes Bucket 3 m=3 3 Algorithms & Datastructures // W // 3
BUCKET SORT Setze jedes Element des Arrays in passendes Bucket 3 3 m=3 3 Algorithms & Datastructures // W // 33
BUCKET SORT ANALYSE Unterbietet N log N im average case: O(N) Voraussetzung: Schlüssel kommen gleichverteilt in festem Intervall vor (hier benutztes Beispiel: Schlüssel aus..) auf Kosten zusätzlichen Speicherplatzes O(N) Idee: Schlüsselintervall wird in N gleichgroße Teilintervalle aufgeteilt. Zusätzlich zu Array a[..n] gibt es Array b[..n-] von Zeigern auf N lineare Listen (Buckets, Körbe). Die Listen enthalten die Elemente, die in dem jeweiligem Teilintervall liegen. Algorithms & Datastructures // W // 3
BUCKET SORT for i:= to n- do initialisiere b[i] mit leerer Liste for i:= to n do trage a[i] in Liste b[a[i].key div ] ein for i:= to n- do sortiere Listen b[i] nach Standardverfahren füge Listen b[], b[],... b[n-] zu sortierter Liste zusammen Wahrscheinlichkeit ist sehr hoch, daß nur sehr kurze Listen entstehen, dadurch linearer average case. Worst case hängt von worst case für gewähltes Standardverfahren ab. Algorithms & Datastructures // W // 3
BUCKET SORT Beispiel: Datensätze mit -stelligen Dezimalschlüsseln (d.h.: N =, m =, L = ) 3 a: 3 3 b: - -3 - - - a: Algorithms & Datastructures // W // 3
BUCKET SORT Beispiel: Datensätze mit -stelligen Dezimalschlüsseln (d.h.: N =, m =, L = ) 3 a: 3 3 b: - -3 - - - 3 a: Algorithms & Datastructures // W // 3
BUCKET SORT Beispiel: Datensätze mit -stelligen Dezimalschlüsseln (d.h.: N =, m =, L = ) 3 a: 3 3 b: - -3 - - - 3 3 3 Algorithms & Datastructures // W // 3
SORTIEREN DURCH FACHVERTEILUNG Methode: zu sortierendes Feld a[] a[n] besteht aus m-adischen Schlüsseln gleicher Länge L Algorithmus wird unterteilt in eine Verteilungsphase und Sammelphase In der Verteilungsphase werden die Datensätze auf m Fächer verteilt (das i-te Fach F i nimmt alle Datensätze auf, deren Schlüssel an Position t die Ziffer i haben) In der Sammelphase werden die Datensätze in den Fächern F, F m- eingesammelt, sodass die relative Ordnung in den einzelnen Fächern erhalten bleibt (stabiles Verfahren) Algorithms & Datastructures // W // 3
SORTIEREN DURCH FACHVERTEILUNG Beispiel Datensätze mit -stelligen Dezimalschlüsseln (d.h.: N =, m =, L = ), 3,,,,,,,, 3,, ) Verteilung erfolgt auf Fächer/Buckets (mit t = ) 3 F F F 3 F 3 F F F F F F ) Nach der ersten Sammelphase ergibt sich folgende Schlüsselfolge,, 3,,,,,,,, 3, Algorithms & Datastructures // W //
SORTIEREN DURCH FACHVERTEILUNG Beispiel,, 3,,,,,,,, 3, 3) erneute Verteilung auf nach der Ziffer an Position t = ergibt: 3 3 F F F F 3 F F F F F F ) Sammeln der Schlüssel ergibt die sortierte Schlüsselfolge, 3,,,,,, 3,,,, Algorithms & Datastructures // W //
Algorithms & Data Structures Digital Sorting WS B. Anzengruber-Tanase (Institute for Pervasive Computing, JKU Linz) (Institute for Pervasive Computing, JKU Linz)