www.wikidata.de-de.nina.az
Mergesort von englisch merge verschmelzen und sort sortieren ist ein stabiler Sortieralgorithmus der nach dem Prinzip teile und herrsche divide and conquer arbeitet Er wurde erstmals 1945 durch John von Neumann vorgestellt 1 Beispiel wie Mergesort eine Liste sortiert Die Listenelemente werden durch Punkte dargestellt Die waagerechte Achse gibt an wo sich ein Element in der Liste befindet die senkrechte Achse gibt an wie gross ein Element ist Inhaltsverzeichnis 1 Funktionsweise 1 1 Veranschaulichung der Funktionsweise 2 Implementierung 3 Beispiel 3 1 Java Implementation 3 1 1 Der Merge Schritt im Detail 4 Komplexitat 5 Korrektheit und Terminierung 6 Natural Mergesort 7 Paralleler Mergesort 7 1 Mergesort mit parallelen Rekursionsaufrufen 7 2 Mergesort mit paralleler Mischmethode 7 3 Paralleler Mehrwege Mergesort 7 3 1 Grundidee 7 3 2 Trennelementbestimmung 7 3 3 Pseudocode 7 3 4 Analyse 7 3 5 Praktische Anpassung und Anwendung 7 4 Weitere Varianten 8 Sonstiges 9 Literatur 10 Weblinks 11 EinzelnachweiseFunktionsweise BearbeitenMergesort betrachtet die zu sortierenden Daten als Liste und zerlegt sie in kleinere Listen die jede fur sich sortiert werden Die kleinen sortierten Listen werden dann im Reissverschlussverfahren zu grosseren sortierten Listen zusammengefugt engl to merge bis eine sortierte Gesamtliste erreicht ist Das Verfahren arbeitet bei Arrays in der Regel nicht in place es sind dafur aber trickreiche Implementierungen bekannt in welchen die Teil Arrays ublicherweise rekursiv zusammengefuhrt werden 2 Verkettete Listen sind besonders geeignet zur Implementierung von Mergesort dabei ergibt sich die in place Sortierung fast von selbst Veranschaulichung der Funktionsweise Bearbeiten nbsp FunktionsweiseDas Bild veranschaulicht die drei wesentlichen Schritte eines Teile und herrsche Verfahrens wie sie im Rahmen von Mergesort umgesetzt werden Der Teile Schritt ist ersichtlich trivial die Daten werden einfach in zwei Halften aufgeteilt Die wesentliche Arbeit wird beim Verschmelzen merge geleistet daher ruhrt auch der Name des Algorithmus Bei Quicksort ist hingegen der Teile Schritt aufwendig und der Merge Schritt einfacher namlich eine Konkatenierung Bei der Betrachtung des in der Grafik dargestellten Verfahrens sollte man sich allerdings bewusst machen dass es sich hier nur um eine von mehreren Rekursionsebenen handelt So konnte etwa die Sortierfunktion welche die beiden Teile 1 und 2 sortieren soll zu dem Ergebnis kommen dass diese Teile immer noch zu gross fur die Sortierung sind Beide Teile wurden dann wiederum aufgeteilt und der Sortierfunktion rekursiv ubergeben so dass eine weitere Rekursionsebene geoffnet wird welche dieselben Schritte abarbeitet Im Extremfall der bei Mergesort sogar der Regelfall ist wird das Aufteilen so weit fortgesetzt bis die beiden Teile nur noch aus einzelnen Datenelementen bestehen und damit automatisch sortiert sind Implementierung BearbeitenDer folgende Pseudocode illustriert die Arbeitsweise des Algorithmus wobei liste die zu sortierenden Elemente enthalt funktion mergesort liste falls Grosse von liste lt 1 dann antworte liste sonst halbiere die liste in linkeListe rechteListe linkeListe mergesort linkeListe rechteListe mergesort rechteListe antworte merge linkeListe rechteListe funktion merge linkeListe rechteListe neueListe solange linkeListe und rechteListe nicht leer falls erstes Element der linkeListe lt erstes Element der rechteListe dann fuge erstes Element linkeListe in die neueListe hinten ein und entferne es aus linkeListe sonst fuge erstes Element rechteListe in die neueListe hinten ein und entferne es aus rechteListe solange ende solange linkeListe nicht leer fuge erstes Element linkeListe in die neueListe hinten ein und entferne es aus linkeListe solange ende solange rechteListe nicht leer fuge erstes Element rechteListe in die neueListe hinten ein und entferne es aus rechteListe solange ende antworte neueListeBeispiel Bearbeiten nbsp Im letzten Verschmelzungsschritt ist das Reissverschlussverfahren beim Verschmelzen in der Abb Mischen angedeutet Blaue Pfeile verdeutlichen den Aufteilungsschritt grune Pfeile die Verschmelzungsschritte Es folgt ein Beispielcode analog zum obigen Abschnitt Implementierung fur den rekursiven Sortieralgorithmus Er teilt rekursiv absteigend die Eingabe in 2 kleinere Listen bis diese trivialerweise sortiert sind und verschmilzt sie auf dem rekursiven Ruckweg wodurch sie sortiert werden function merge sort list x if length x 1 then return x Kurzes x ist trivialerweise sortiert var l empty list var r empty list var nx length x 1 Teile x in die zwei Halften l und r for i 0 to floor nx 2 do append x i to l for i floor nx 2 1 to nx do append x i to r und sortiere beide einzeln l merge sort l r merge sort r Verschmelze die sortierten Halften return merge l r Beispielcode zum Verschmelzen zweier sortierter Listen function merge list l list r var y empty list Ergebnisliste var nl length l 1 var nr length r 1 var il 0 for i 0 to nl nr 1 do if il gt nl then append r i il to y continue if il lt i nr then append l il to y il il 1 continue Jetzt ist 0 il nl und 0 i il nr if l il r i il then append l il to y il il 1 else append r i il to y return y Java Implementation Bearbeiten Eine iterative Implementation in der Programmiersprache Java unter Verwendung von verketteten Listen konnte folgendermassen aussehen Es wird eine merge Funktion zu verschmelzen zweier Listen verwendet die im Absatz darunter erlautert wird void mergeSort List lt Integer gt l int n l size Erstelle n Teillisten 1 Element pro Liste Divide LinkedList lt LinkedList lt Integer gt gt groups new LinkedList lt LinkedList lt Integer gt gt for int i 0 i lt n i LinkedList lt Integer gt list new LinkedList lt gt list add l get i groups add list Solange mehrere Gruppen existieren while groups size gt 1 Merge die ersten beiden Listen im vorrat und hange die verbundene Liste hinten an groups addLast merge groups removeFirst groups removeFirst Uberschreibe die unsortierte Liste mit der sortierten Version list groups getFirst Der Merge Schritt im Detail Bearbeiten Gegeben sind zwei in sich sortierte Listen A displaystyle A nbsp und B displaystyle B nbsp die zu einer sortierten Liste C displaystyle C nbsp zusammengefugt werden sollen Man vergleicht nun die beiden kleinsten Elemente am Anfang der Listen A displaystyle A nbsp und B displaystyle B nbsp fugt das kleinere zu C displaystyle C nbsp hinzu und nimmt es aus der jeweiligen Liste A displaystyle A nbsp oder B displaystyle B nbsp heraus Dies wird so lange wiederholt bis eine der beiden Listen A oder B leer ist danach wird der Rest aus der anderen Liste A displaystyle A nbsp oder B displaystyle B nbsp in der noch Eintrage vorhanden sind ans Ende von C displaystyle C nbsp gehangt Der Mergeschritt braucht genau immer A B displaystyle A B nbsp Operationen da jedes Element aus beiden Listen in konstanter Zeit geloscht und hinzugefugt werden kann Die Laufzeit betragt folglich O A B displaystyle mathcal O A B nbsp LinkedList lt Integer gt merge LinkedList lt Integer gt linkeListe LinkedList lt Integer gt rechteListe LinkedList lt Integer gt temp new LinkedList lt gt Solange noch nicht beide Listen hinzugefugt worden while linkeListe isEmpty amp amp rechteListe isEmpty if linkeListe getFirst lt rechteListe getFirst temp addLast linkeListe removeFirst else temp addLast rechteListe removeFirst Fuge Rest hinzu falls etwas ubrig ist temp addAll linkeListe temp addAll rechteListe return temp Komplexitat BearbeitenMergesort ist ein stabiles Sortierverfahren vorausgesetzt der Merge Schritt ist entsprechend implementiert Seine Komplexitat betragt im Worst Best und Average Case in Landau Notation ausgedruckt stets O n log n displaystyle mathcal O n cdot log n nbsp Damit ist Mergesort hinsichtlich der Komplexitat Quicksort grundsatzlich uberlegen da Quicksort ohne besondere Vorkehrungen ein Worst Case Verhalten von 8 n 2 displaystyle Theta n 2 nbsp besitzt Es benotigt jedoch zusatzlichen Speicherplatz der Grossenordnung O n displaystyle mathcal O n nbsp ist also kein In place Verfahren Fur die Laufzeit T n displaystyle T n nbsp von Mergesort bei n displaystyle n nbsp zu sortierenden Elementen gilt die Rekursionsformel T n T n 2 Aufwand den einen Teil zu sortieren T n 2 Aufwand den anderen Teil zu sortieren O n Aufwand die beiden Teile zu verschmelzen displaystyle T n underbrace T lfloor tfrac n 2 rfloor text Aufwand den einen Teil zu sortieren underbrace T lceil tfrac n 2 rceil text Aufwand den anderen Teil zu sortieren underbrace mathcal O n text Aufwand die beiden Teile zu verschmelzen nbsp mit dem Rekursionsanfang T 1 1 displaystyle T 1 1 nbsp Nach dem Master Theorem kann die Rekursionsformel durch 2 T n 2 n displaystyle 2 T lfloor tfrac n 2 rfloor n nbsp bzw 2 T n 2 n displaystyle 2 T lceil tfrac n 2 rceil n nbsp approximiert werden mit jeweils der Losung 2 Fall des Mastertheorems s dort T n O n log n displaystyle T n mathcal O n cdot log n nbsp Durchschnittliche und maximale Anzahl Vergleiche Sind l 0 l 1 displaystyle l 0 l 1 nbsp die Langen der zu verschmelzenden und vorsortierten Folgen F 0 F 1 displaystyle F 0 F 1 nbsp dann gilt fur die Anzahl M displaystyle M nbsp der erforderlichen Vergleiche furs sortierende Verschmelzen min l 0 l 1 M l 0 l 1 1 displaystyle min l 0 l 1 leq M leq l 0 l 1 1 nbsp da erstens eine Folge komplett vor der anderen liegen kann d h es ist F 0 l 0 F 1 1 displaystyle F 0 l 0 prec F 1 1 nbsp bzw F 1 l 1 F 0 1 displaystyle F 1 l 1 prec F 0 1 nbsp oder es ist zweitens F 0 l 0 1 F 1 l 1 F 0 l 0 displaystyle F 0 l 0 1 prec F 1 l 1 prec F 0 l 0 nbsp bzw umgekehrt sodass die Elemente bis zum letzten Element in jeder Folge verglichen werden mussen Dabei ist jeweils angenommen dass das Vergleichen der zwei Folgen bei den Elementen mit niedrigem Index beginnt Mit V m l 0 l 1 l 0 l 1 1 displaystyle V m l 0 l 1 l 0 l 1 1 nbsp Subskript m displaystyle m nbsp fur maximal sei die maximale Anzahl der Vergleiche furs Verschmelzen bezeichnet Fur die maximale Anzahl S m n displaystyle S m n nbsp an Vergleichen fur einen ganzen Mergesort Lauf von n displaystyle n nbsp Elementen errechnet sich daraus S m n n l 2 l 1 displaystyle S m n nl 2 l 1 nbsp mit l log 2 n displaystyle l lceil log 2 n rceil nbsp S m n displaystyle S m n nbsp ist die Folge A001855 in OEIS Fur eine Gleichverteilung lasst sich auch die durchschnittliche Anzahl V l 0 l 1 displaystyle V varnothing l 0 l 1 nbsp Subskript displaystyle varnothing nbsp fur durchschnittlich der Vergleiche genau berechnen und zwar ist fur l 1 l 0 displaystyle l 1 l 0 nbsp V l 0 l 0 k l 0 2 l 0 1 k 1 l 0 1 k k l 0 2 l 0 1 k 1 l 0 1 2 l 0 2 l 0 1 displaystyle begin aligned V varnothing l 0 l 0 amp left sum k l 0 2l 0 1 binom k 1 l 0 1 k right bigg left sum k l 0 2l 0 1 binom k 1 l 0 1 right amp 2 l 0 2 l 0 1 end aligned nbsp und fur l 1 l 0 1 displaystyle l 1 l 0 1 nbsp V l 0 l 0 1 k l 0 2 l 0 1 k 1 l 0 1 k k l 0 1 2 l 0 2 k 1 l 0 2 k k l 0 2 l 0 1 k 1 l 0 1 k l 0 1 2 l 0 2 k 1 l 0 2 2 l 0 2 l 0 1 1 displaystyle begin aligned V varnothing l 0 l 0 1 amp left sum k l 0 2l 0 1 binom k 1 l 0 1 k sum k l 0 1 2l 0 2 binom k 1 l 0 2 k right amp bigg left sum k l 0 2l 0 1 binom k 1 l 0 1 sum k l 0 1 2l 0 2 binom k 1 l 0 2 right amp 2 l 0 2 l 0 1 1 end aligned nbsp Dabei ist k displaystyle k nbsp die Anzahl der Vergleiche fur die Anordnung u v w 0 k 1 1 1 l 1 l 0 k displaystyle underbrace u v dotso w 0 k underbrace 1 1 dotso 1 l 1 l 0 k nbsp wobei 0 displaystyle 0 nbsp fur das letzte das am hochsten sortierende Element in der Folge F 0 displaystyle F 0 nbsp steht die nicht von einem Element aus F 0 displaystyle F 0 nbsp unterbrochenen 1 displaystyle 1 nbsp en zu F 1 displaystyle F 1 nbsp gehoren und u v w displaystyle u v w nbsp die auch fehlen konnen entweder zu F 0 displaystyle F 0 nbsp oder zu F 1 displaystyle F 1 nbsp gehoren Der in den Summenformeln beigegebene Binomialkoeffizient zahlt die verschiedenen Moglichkeiten fur u v w displaystyle u v dotso w nbsp Fur die durchschnittliche Anzahl S n displaystyle S varnothing n nbsp an Vergleichen fur einen ganzen Mergesort Lauf von n displaystyle n nbsp Elementen errechnet man daraus n displaystyle n nbsp S n displaystyle S varnothing n nbsp S m n displaystyle S m n nbsp S m n displaystyle S m n nbsp S n n displaystyle S varnothing n n nbsp 2 1 0000 1 0 000003 2 6667 3 0 111114 4 6667 5 0 083336 9 8333 11 0 194448 15 733 17 0 1583312 29 952 33 0 2539716 45 689 49 0 2069424 82 059 89 0 2892232 121 50 129 0 2345248 210 20 225 0 3083964 305 05 321 0 2492096 514 44 545 0 31838128 736 13 769 0 25677192 1218 9 1281 0 32348256 1726 3 1793 0 26061384 2819 8 2945 0 32606512 3962 6 4097 0 26255768 6405 6 6657 0 327361024 8947 2 9217 0 263521536 14345 0 14849 0 328012048 19940 0 20481 0 264013072 31760 0 32769 0 328334096 43974 0 45057 0 264266144 69662 0 71681 0 328498192 96139 0 98305 0 2643812288 1 5161E5 155649 0 3285716384 2 0866E5 212993 0 2644424576 3 278E5 335873 0 3286232768 4 5009E5 458753 0 2644749152 7 0474E5 720897 0 3286465536 9 6571E5 983041 0 2644898304 1 5078E6 1540097 0 32865131072 2 0625E6 2097153 0 26449196608 3 2122E6 3276801 0 32865262144 4 3871E6 4456449 0 26450393216 6 8176E6 6946817 0 32865524288 9 2985E6 9437185 0 26450786432 1 4422E7 14680065 0 328651048576 1 9646E7 19922945 0 264501572864 3 0416E7 30932993 0 328662097152 4 1388E7 41943041 0 264503145728 6 3978E7 65011713 0 328664194304 8 6971E7 88080385 0 264506291456 1 3425E8 136314881 0 328668388608 1 8233E8 184549377 0 2645012582912 2 8108E8 285212673 0 3286616777216 3 8144E8 385875969 0 26450und findet S m n 0 328 6560975 n S n S m n displaystyle S m n 0 3286560975 n leq S varnothing n leq S m n nbsp Korrektheit und Terminierung BearbeitenDer Rekursionsabbruch stellt die Terminierung von Mergesort offensichtlich sicher so dass lediglich noch die Korrektheit gezeigt werden muss Dies geschieht indem wir folgende Behauptung beweisen Behauptung In Rekursionstiefe i displaystyle i nbsp werden die sortierten Teillisten aus Rekursionstiefe i 1 displaystyle i 1 nbsp korrekt sortiert Beweis Sei o B d A die i 1 displaystyle i 1 nbsp te Rekursion die tiefste Dann sind die Teillisten offensichtlich sortiert da sie einelementig sind Somit ist ein Teil der Behauptung schon mal gesichert Nun werden diese sortierten Teillisten eine Rekursionsebene nach oben also in die i displaystyle i nbsp te Rekursion ubergeben Dort werden diese nach Konstruktion der merge Prozedur von Mergesort korrekt sortiert Somit ist unsere Behauptung erfullt und die totale Korrektheit von Mergesort bewiesen Natural Mergesort BearbeitenNatural Mergesort naturliches Mergesort ist eine Erweiterung von Mergesort die bereits vorsortierte Teilfolgen so genannte runs innerhalb der zu sortierenden Startliste ausnutzt Die Basis fur den Mergevorgang bilden hier nicht die rekursiv oder iterativ gewonnenen Zweiergruppen sondern die in einem ersten Durchgang zu bestimmenden runs Startliste 3 4 2 1 7 5 8 9 0 6 Runs bestimmen 3 4 2 1 7 5 8 9 0 6 Merge 2 3 4 1 5 7 8 9 0 6 Merge 1 2 3 4 5 7 8 9 0 6 Merge 0 1 2 3 4 5 6 7 8 9 Diese Variante hat den Vorteil dass sortierte Folgen erkannt werden und die Komplexitat im Best Case O n displaystyle mathcal O n nbsp betragt Average und Worst Case Verhalten andern sich hingegen nicht Ausserdem eignet sich Mergesort gut fur grossere Datenmengen die nicht mehr im Hauptspeicher gehalten werden konnen es mussen jeweils nur beim Verschmelzen in jeder Ebene zwei Listen vom externen Zwischenspeicher z B Festplatte gelesen und eine dorthin geschrieben werden Eine Variante nutzt den verfugbaren Hauptspeicher besser aus und minimiert Schreib Lesezugriffe auf der Festplatte indem mehr als nur zwei Teil Listen gleichzeitig vereinigt werden und damit die Rekursionstiefe abnimmt Paralleler Mergesort BearbeitenMergesort lasst sich aufgrund des Teile und herrsche Ansatzes gut parallelisieren Verschiedene parallele Varianten wurden in der Vergangenheit entwickelt Manche sind stark verwandt mit der hier vorgestellten sequentiellen Variante wahrend andere eine grundlegend verschiedene Struktur besitzen und das K Wege Mischen verwenden Mergesort mit parallelen Rekursionsaufrufen Bearbeiten Der sequentielle Mergesort kann in zwei Phasen beschrieben werden die Teilen Phase und die anschliessende Misch Phase Die erste besteht aus vielen rekursiven Aufrufen die immer wieder den gleichen Aufteilungsprozess durchfuhren bis die Teilsequenzen trivial sortiert sind mit einem oder keinem Element Ein intuitiver Ansatz ist es diese rekursiven Aufrufe zu parallelisieren 3 Der folgende Pseudocode beschreibt den klassischen Mergesort Algorithmus mit paralleler Rekursion unter Verwendung der Schlusselworter fork and join Sort elements lo through hi exclusive of array A algorithm mergesort A lo hi is if lo 1 lt hi then Two or more elements mid lo hi 2 fork mergesort A lo mid mergesort A mid hi join merge A lo mid hi Dieser Algorithmus ist die triviale Modifikation des sequentiellen Algorithmus und ist noch nicht optimal Sein Speedup ist dementsprechend auch nicht beeindruckend Er hat einen Spann von 8 n displaystyle Theta n nbsp was nur eine Verbesserung um den Faktor 8 log n displaystyle Theta log n nbsp ist im Vergleich zur sequentiellen Version siehe auch Introduction to Algorithms Dies liegt hauptsachlich an der sequentiellen Mischmethode welche der Flaschenhals der parallelen Ausfuhrung ist Mergesort mit paralleler Mischmethode Bearbeiten Ein besserer Parallelismus kann durch eine parallele Mischmethode erreicht werden Cormen et al prasentieren eine binare Variante welche zwei sortierte Teilsequenzen in eine sortierte Ausgabesequenz mischt Eine ausfuhrlichere Beschreibung findet sich hier 3 In der langeren der beiden Sequenzen falls ungleich lang wird das Element des mittleren Indexes ausgewahlt Seine Position in der anderen Sequenz wird so bestimmt dass die Sequenz sortiert bliebe wenn dieses Element an der bestimmten Stelle eingefugt werden wurde So weiss man wie viele Elemente insgesamt kleiner sind als das Pivotelement und die finale Position des Pivots kann in der Ausgabesequenz berechnet werden Fur die so erzeugten Teilfolgen der kleineren und grosseren Elemente wird die Mischmethode wieder parallel ausgefuhrt bis der Basisfall der Rekursion erreicht ist Der folgende Pseudocode illustriert den Mergesort mit modifizierter paralleler Mischmethode aus Cormen et al A Input array B Output array lo lower bound hi upper bound off offset algorithm parallelMergesort A lo hi B off is len hi lo 1 if len 1 then B off A lo else let T 1 len be a new array mid lo hi 2 mid mid lo 1 fork parallelMergesort A lo mid T 1 parallelMergesort A mid 1 hi T mid 1 join parallelMerge T 1 mid mid 1 len B off Um eine Rekurrenzrelation fur den Worst Case zu erhalten mussen die rekursiven Aufrufe von parallelMergesort aufgrund der parallelen Ausfuhrung nur einmal aufgefuhrt werden Man erhaltT sort n T sort n 2 T merge n T sort n 2 8 log n 2 textstyle T infty text sort n T infty text sort left frac n 2 right T infty text merge n T infty text sort left frac n 2 right Theta left log n 2 right nbsp Fur genauere Informationen uber die Komplexitat der parallelen Mischmethode siehe Merge algorithm Die Losung dieser Rekurrenz istT sort 8 log n 3 textstyle T infty text sort Theta left log n 3 right nbsp Dieser Algorithmus erreicht eine Parallelisierbarkeit von 8 n log n 2 displaystyle Theta biggr n over log n 2 biggr nbsp was um einiges besser ist als der Parallelismus des vorherigen Algorithmus Solch ein Sortieralgorithmus kann wenn er mit einem schnellen stabilen sequentiellen Sortieralgorithmus und einer sequentiellen Mischmethode als Basisfall fur das Mischen von zwei kleinen Sequenzen ausgestattet ist gut in der Praxis funktionieren 4 Paralleler Mehrwege Mergesort Bearbeiten Es wirkt unnaturlich Mergesort Algorithmen auf binare Mischmethoden zu beschranken da oftmals mehr als zwei Prozessoren zur Verfugung stehen Ein besserer Ansatz ware es ein K Wege Mischen zu realisieren Diese Generalisierung mischt im Gegensatz zum binaren Mischen k displaystyle k nbsp sortierte Sequenzen zu einer sortierten Sequenz Diese Misch Variante eignet sich gut zur Beschreibung eines Sortieralgorithmus auf einem PRAM 5 6 Grundidee Bearbeiten nbsp Der parallele Mehrwege Mergesort Algorithmus auf vier Prozessoren t 0 displaystyle t 0 nbsp bis t 3 displaystyle t 3 nbsp Gegeben sei eine Folge von n displaystyle n nbsp Elementen Ziel ist es diese Sequenz mit p displaystyle p nbsp verfugbaren Prozessoren zu sortieren Die Elemente sind dabei gleich auf alle Prozessoren aufgeteilt und werden zunachst lokal mit einem sequentiellen Sortieralgorithmus vorsortiert Dementsprechend bestehen die Daten nun aus sortierten Folgen S 1 S p displaystyle S 1 S p nbsp der Lange n p textstyle lceil frac n p rceil nbsp Der Einfachheit halber sei n displaystyle n nbsp ein Vielfaches von p displaystyle p nbsp so dass fur i 1 p displaystyle i 1 p nbsp gilt S i n p textstyle left vert S i right vert frac n p nbsp Jede dieser Sequenzen wird wiederum in p displaystyle p nbsp Teilsequenzen S i 1 S i p displaystyle S i 1 S i p nbsp partitioniert indem fur j 1 p displaystyle j 1 p nbsp die Trennelemente v j displaystyle v j nbsp mit globalem Rang k j n p textstyle k j frac n p nbsp bestimmt werden Die korrespondierenden Indizes werden in jeder Folge S i displaystyle S i nbsp mit binarer Sucher ermittelt sodass die Folgen anhand der Indizes aufgeteilt werden konnen Formal definiert gilt somit S i j x S i r a n k v j 1 lt r a n k x r a n k v j displaystyle S i j x in S i rank v j 1 lt rank x leq rank v j nbsp Nun werden die Elemente von S 1 i S p i displaystyle S 1 i S p i nbsp dem Prozessor i displaystyle i nbsp zugeteilt Dies sind alle Elemente vom globalen Rang i 1 n p textstyle i 1 frac n p nbsp bis zum Rang i n p textstyle i frac n p nbsp die uber die S i displaystyle S i nbsp verteilt sind So erhalt jeder Prozessor eine Folge von sortierten Sequenzen Aus der Tatsache dass der Rang k displaystyle k nbsp der Trennelemente v i displaystyle v i nbsp global gewahlt wurde ergeben sich zwei wichtige Eigenschaften Zunachst sind die Trennelemente so gewahlt dass jeder Prozessor nach der Zuteilung der neuen Daten immer noch mit n p textstyle n p nbsp Elementen betraut ist Der Algorithmus besitzt also eine perfekte Lastverteilung Ausserdem sind alle Elemente des Prozessors i displaystyle i nbsp kleiner oder gleich der Elemente des Prozessors i 1 displaystyle i 1 nbsp Wenn nun jeder Prozessor ein p Wege Mischen lokal durchfuhrt sind aufgrund dieser Eigenschaft die Elemente global sortiert Somit mussen die Ergebnisse nur in der Reihenfolge der Prozessoren zusammengesetzt werden Trennelementbestimmung Bearbeiten In der einfachsten Form sind p displaystyle p nbsp sortierte Folgen S 1 S p displaystyle S 1 S p nbsp gleichverteilt auf p displaystyle p nbsp Prozessoren sowie ein Rang k displaystyle k nbsp gegeben Gesucht ist nun ein Trennelement x displaystyle x nbsp mit globalem Rang k displaystyle k nbsp in der Vereinigung der Folgen Damit kann jede Folge S i displaystyle S i nbsp an einem Index l i displaystyle l i nbsp in zwei Teile aufgeteilt werden Der untere Teil besteht nur aus Elementen die kleiner x displaystyle x nbsp sind wahrend der obere Teil alle Elemente enthalt welche grosser oder gleich als x displaystyle x nbsp sind Der hier vorgestellte sequentielle Algorithmus gibt die Indizes der Trennungen zuruck also die Indizes l i displaystyle l i nbsp in den Folgen S i displaystyle S i nbsp sodass S i l i displaystyle S i l i nbsp einen global kleineren Rang als k displaystyle k nbsp hat und r a n k S i l i 1 k displaystyle mathrm rank left S i l i 1 right geq k nbsp ist 7 algorithm msSelect S Array of sorted Sequences S 1 S p k int is for i 1 to p do l i r i 0 S i 1 while there exists i l i lt r i do pick Pivot Element in S j l j S j r j chose random j uniformly v pickPivot S l r for i 1 to p do m i binarySearch v S i l i r i sequentially if m 1 m p gt k then m 1 m p is the global rank of v r m vector assignment else l m return l Fur die Komplexitatsanalyse wurde das PRAM Modell gewahlt Die p fache Ausfuhrung der binarySearch Methode hat eine Laufzeit in O p log n p displaystyle mathcal O left p log left n p right right nbsp falls die Daten uber alle p displaystyle p nbsp Prozessoren gleichverteilt anliegen Die erwartete Rekursionstiefe betragt wie im Quickselect Algorithmus O log i S i O log n displaystyle mathcal O left log left textstyle sum i S i right right mathcal O log n nbsp Somit ist die gesamte erwartete Laufzeit O p log n p log n displaystyle mathcal O left p log n p log n right nbsp Angewandt auf den parallelen Mehrwege Mergesort muss die msSelect Methode parallel ausgefuhrt werden um alle Trennelemente vom Rang i n p textstyle i frac n p nbsp gleichzeitig zu finden Dies kann anschliessend verwendet werden um jede Folge in p displaystyle p nbsp Teile zu zerschneiden Es ergibt sich die gleiche Gesamtlaufzeit O p log n p log n displaystyle mathcal O left p log n p log n right nbsp Pseudocode Bearbeiten Hier ist der komplette Pseudocode fur den parallelen Mehrwege Mergesort Dabei wird eine Barriere Synchronisation vor und nach der Trennelementbestimmung angenommen sodass jeder Prozessor seine Trennelemente und die Partitionierung seiner Sequenz richtig berechnen kann d Unsorted Array of Elements n Number of Elements p Number of Processors return Sorted Array algorithm parallelMultiwayMergesort d Array n int p int is o new Array 0 n the output array for i 1 to p do in parallel each processor in parallel S i d i 1 n p i n p Sequence of length n p sort S i sort locally synch v i msSelect S 1 S p i n p element with global rank i n p synch S i 1 S i p sequence partitioning si v 1 v p split s i into subsequences o i 1 n p i n p kWayMerge s 1 i s p i merge and assign to output array return o Analyse Bearbeiten Zunachst sortiert jeder Prozessor die zugewiesenen n p displaystyle n p nbsp Elemente lokal mit einem vergleichsbasierten Sortieralgorithmus der Komplexitat O n p log n p displaystyle mathcal O left n p log n p right nbsp Anschliessend konnen die Trennelemente in Zeit O p log n p log n displaystyle mathcal O left p log n p log n right nbsp bestimmt werden Schliesslich mussen jede Gruppe von p displaystyle p nbsp Teilstucken gleichzeitig von jedem Prozessor zusammen gemischt werden Dies hat eine Laufzeit von O log p n p displaystyle mathcal O log p n p nbsp indem ein sequentieller k Wege Mischalgorithmus verwendet wird Somit ergibt sich eine Gesamtlaufzeit vonO n p log n p p log n p log n n p log p displaystyle mathcal O left frac n p log left frac n p right p log left frac n p right log n frac n p log p right nbsp Praktische Anpassung und Anwendung Bearbeiten Der Mehrwege Mergesort Algorithmus ist durch seine hohe Parallelitat was den Einsatz vieler Prozessoren ermoglicht sehr skalierbar Dies macht den Algorithmus zu einem brauchbaren Kandidaten fur das Sortieren grosser Datenmengen wie sie beispielsweise in Computer Clustern verarbeitet werden Da der Speicher in solchen Systemen in der Regel keine limitierende Ressource darstellt ist der Nachteil der Speicherkomplexitat von Mergesort vernachlassigbar Allerdings werden in solchen Systemen andere Faktoren wichtig die bei der Modellierung auf einer PRAM nicht berucksichtigt werden Hier sind unter anderem die folgenden Aspekte zu berucksichtigen Die Speicherhierarchie wenn die Daten nicht in den Cache der Prozessoren passen oder der Kommunikationsaufwand beim Datenaustausch zwischen den Prozessoren der zu einem Engpass werden konnte wenn auf die Daten nicht mehr uber den gemeinsamen Speicher zugegriffen werden kann Sanders et al haben in ihrem Paper einen bulk synchronous parallel Algorithmus fur einen mehrstufigen Mehrwege Mergesort vorgestellt der p displaystyle p nbsp Prozessoren in r displaystyle r nbsp Gruppen der Grosse p displaystyle p nbsp unterteilt Alle Prozessoren sortieren zuerst lokal Im Gegensatz zu einem einstufigen Mehrwege Mergesort werden diese Sequenzen dann in r displaystyle r nbsp Teile aufgeteilt und den entsprechenden Prozessorgruppen zugeordnet Diese Schritte werden innerhalb dieser Gruppen rekursiv wiederholt So wird die Kommunikation reduziert und insbesondere Probleme mit vielen kleinen Nachrichten vermieden Die hierarchische Struktur des zugrundeliegenden realen Netzwerks z B Racks Cluster kann zur Definition der Prozessorgruppen verwendet werden 6 Weitere Varianten Bearbeiten Mergesort war einer der ersten Sortieralgorithmen bei dem ein optimaler Speedup erreicht wurde wobei Richard Cole einen cleveren Subsampling Algorithmus verwendete um die O 1 Zusammenfuhrung sicherzustellen 8 Andere ausgeklugelte parallele Sortieralgorithmen konnen die gleichen oder bessere Zeitschranken mit einer niedrigeren Konstante erreichen David Powers beschrieb beispielsweise 1991 einen parallelisierten Quicksort und einen verwandten Radixsort der durch implizite Partitionierung in O log n displaystyle O log n nbsp Zeit auf einer CRCW Parallel Random Access Machine PRAM mit n displaystyle n nbsp Prozessoren arbeiten kann 9 Powers zeigt ferner dass eine Pipeline Version von Batchers Bitonic Mergesort in O log n 2 displaystyle O log n 2 nbsp Zeit auf einem Butterfly Sortiernetzwerk in der Praxis schneller ist als sein O log n displaystyle O log n nbsp Sortieralgorithmus auf einer PRAM und er bietet eine detaillierte Diskussion der versteckten Overheads beim Vergleich bei der Radix und der Parallelsortierung 10 Sonstiges BearbeitenDa Mergesort die Startliste sowie alle Zwischenlisten sequenziell abarbeitet eignet er sich besonders zur Sortierung von verketteten Listen Fur Arrays wird normalerweise ein temporares Array derselben Lange des zu sortierenden Arrays als Zwischenspeicher verwendet das heisst Mergesort arbeitet normalerweise nicht in place s o Quicksort dagegen benotigt kein temporares Array Fur die Grosse des temporaren Arrays reicht die halbe Grosse der Anzahl der Elemente n 2 aus Unoptimierte Codebeispiele arbeiten mit einem Hilfsarray der Grosse n dies ist fur den Mergesort Algorithmus nicht erforderlich 11 Die SGI Implementierung der Standard Template Library STL verwendet den Mergesort als Algorithmus zur stabilen Sortierung 12 Literatur BearbeitenRobert Sedgewick Algorithmen Pearson Studium 2002 ISBN 3 8273 7032 9 Weblinks BearbeitenVisualisierung und Tutorial fur Mergesort mit Darstellung der Rekursion H W Lang Sortierverfahren Mergesort Hochschule Flensburg 2000 2022Einzelnachweise Bearbeiten Donald E Knuth The Art of Computer Programming 2 Auflage Vol 3 Sorting and Searching Addison Wesley 1998 S 158 h2database h2database In GitHub Abgerufen am 1 September 2016 a b Thomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to algorithms 3 Auflage MIT Press Cambridge Mass 2009 ISBN 978 0 262 27083 0 Victor J Duvanenko Parallel Merge Sort In Dr Dobb s Journal amp blog duvanenko tech blog and GitHub repo C implementation github com Peter Sanders Johannes Singler Multi Core Standard Template Library Karlsruher Institut fur Technologie 29 April 2008 abgerufen 5 Februar 2020 englisch a b dl acm org Hrsg Practical Massively Parallel Sorting Proceedings of the 27th ACM symposium on Parallelism in Algorithms and Architectures doi 10 1145 2755573 2755595 englisch acm org abgerufen am 28 Februar 2020 Peter Sanders Parallele Algorithmen Karlsruher Institut fur Technologie 25 November 2019 abgerufen 5 Februar 2020 Richard Cole Parallel Merge Sort In SIAM Journal on Computing Band 17 Nr 4 August 1988 ISSN 0097 5397 S 770 785 doi 10 1137 0217049 siam org abgerufen am 6 Marz 2020 David M W Powers Parallelized Quicksort and Radixsort with Optimal Speedup auf semanticscholar org in Proceedings of International Conference on Parallel Computing Technologies Novosibirsk 1991 David M W Powers Parallel Unification Practical Complexity Australasian Computer Architecture Workshop Flinders University January 1995 H W Lang Sortierverfahren Mergesort iterativ Hochschule Flensburg 2005 2022 mit Hilfsarray b new int n 2 stable sort Memento vom 13 November 2017 im Internet Archive auf sgi com englisch Abgerufen von https de wikipedia org w index php title Mergesort amp oldid 231677893