• Keine Ergebnisse gefunden

A4.1Mergesort AlgorithmenundDatenstrukturen A4.1MergesortA4.2Merge-SchrittA4.3Top-Down-MergesortA4.4Bottom-Up-MergesortA4.5Zusammenfassung AlgorithmenundDatenstrukturen Sortierverfahren

N/A
N/A
Protected

Academic year: 2022

Aktie "A4.1Mergesort AlgorithmenundDatenstrukturen A4.1MergesortA4.2Merge-SchrittA4.3Top-Down-MergesortA4.4Bottom-Up-MergesortA4.5Zusammenfassung AlgorithmenundDatenstrukturen Sortierverfahren"

Copied!
6
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Algorithmen und Datenstrukturen

A4. Sortieren II: Mergesort

Marcel L¨ uthi and Gabriele R¨ oger

Universit¨ at Basel

4./10. M¨ arz 2021

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 1 / 23

Algorithmen und Datenstrukturen

4./10. M¨ arz 2021 — A4. Sortieren II: Mergesort

A4.1 Mergesort A4.2 Merge-Schritt

A4.3 Top-Down-Mergesort A4.4 Bottom-Up-Mergesort A4.5 Zusammenfassung

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 2 / 23

A4. Sortieren II: Mergesort Mergesort

A4.1 Mergesort

A4. Sortieren II: Mergesort Mergesort

Sortierverfahren

Sortieren

Vergleichsbasierte

Verfahren Selectionsort Insertionsort Mergesort

Minimale Vergleichszahl

Quick Sort Heap Sort Nicht

vergleichsbasierte Verfahren

Uberblick und ¨

Ausblick

(2)

A4. Sortieren II: Mergesort Mergesort

Mergesort: Idee

I Beobachtung: zwei bereits sortierte Sequenzen lassen sich leicht zu einer sortierten Sequenz vereinen.

I Sequenzen mit einem oder keinem Element sind sortiert.

I Idee f¨ ur l¨ angere Sequenzen:

I Teile Eingabesequenz in zwei etwa gleich grosse Teilbereiche I Rekursiver Aufruf f¨ ur beide Teilbereiche

I F¨ uge nun sortierte Teilbereiche zusammen.

I Teile-und-Herrsche-Ansatz (divide and conquer)

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 5 / 23

A4. Sortieren II: Mergesort Mergesort

Mergesort: Illustration

7 3 2 9 7 1 4 5

7 3 2 9 7 1 4 5

3 7 2 9 7 1 4 5

3 7 2 9 7 1 4 5

2 3 7 9 7 1 4 5

.. .

2 3 7 9 1 4 5 7

1 2 3 4 5 7 7 9

(Detaillierte Animation in Bildschirm-Version der Folien)

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 6 / 23

A4. Sortieren II: Mergesort Merge-Schritt

A4.2 Merge-Schritt

A4. Sortieren II: Mergesort Merge-Schritt

Verbinden der Teill¨ osungen

I Indizes lo ≤ mid < hi

I Annahme: array[lo] bis array[mid] und

array[mid+1] bis array[hi] sind bereits sortiert I Ziel: array[lo] bis array[hi] ist sortiert

I Idee: gehe parallel von vorne nach hinten durch beide

Teilbereiche und sammle das jeweils kleinere Element auf

I Verwendet zus¨ atzlichen Speicher f¨ ur aufgesammelte Werte

(3)

A4. Sortieren II: Mergesort Merge-Schritt

Verbinden der Teill¨ osungen: Beispiel

Array tmp hat gleiche Gr¨ osse wie Eingabearray.

Initialisierung: i := lo, j := mid + 1, k := lo

a tmp

. . . 2

lo,i

4 5

mid

4

j

7

hi

. . . . . .

k

. . .

a[i]≤a[j] ⇒ tmp[k] = a[i]

. . . 2

lo

4

i

5

mid

4

j

7

hi

. . . . . . 2

k

. . .

a[i]≤a[j] ⇒ tmp[k] = a[i]

. . . 2

lo

4 5

mid,i

4

j

7

hi

. . . . . . 2 4

k

. . .

a[j]<a[i] ⇒ tmp[k] = a[j]

. . . 2

lo

4 5

mid,i

4 7

hi,j

. . . . . . 2 4 4

k

. . .

a[i]≤a[j] ⇒ tmp[k] = a[i]

. . . 2

lo

4 5

mid

4

i

7

hi,j

. . . . . . 2 4 4 5

k

. . .

i>mid ⇒ tmp[k] = a[j]

. . . 2

lo

4 5

mid

4

i

7

hi

. . . . . . 2 4 4 5 7 . . .

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 9 / 23

A4. Sortieren II: Mergesort Merge-Schritt

Verbinden der Teill¨ osungen: Algorithmus

1

def merge(array, tmp, lo, mid, hi):

2

i = lo

3

j = mid + 1

4

for k in range(lo, hi + 1): # k = lo,...,hi

5

if j > hi or (i <= mid and array[i] <= array[j]):

6

tmp[k] = array[i]

7

i += 1

8

else:

9

tmp[k] = array[j]

10

j += 1

11

for k in range(lo, hi + 1): # k = lo,...,hi

12

array[k] = tmp[k]

Auch korrekt f¨ ur lo = mid = hi

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 10 / 23

A4. Sortieren II: Mergesort Merge-Schritt

Jupyter-Notebook

Jupyter-Notebook: merge sort.ipynb

A4. Sortieren II: Mergesort Top-Down-Mergesort

A4.3 Top-Down-Mergesort

(4)

A4. Sortieren II: Mergesort Top-Down-Mergesort

Mergesort: Algorithmus

rekursive Top-Down-Version

1

def sort(array):

2

tmp = [0] * len(array) # [0,...,0] with same size as array

3

sort_aux(array, tmp, 0, len(array) - 1)

4

5

def sort_aux(array, tmp, lo, hi):

6

if hi <= lo:

7

return

8

mid = lo + (hi - lo) // 2

9

# //: Division mit Abrunden

10

sort_aux(array, tmp, lo, mid)

11

sort_aux(array, tmp, mid + 1, hi)

12

merge(array, tmp, lo, mid, hi)

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 13 / 23

A4. Sortieren II: Mergesort Top-Down-Mergesort

M¨ ogliche Verbesserungen

I Auf kurzen Sequenzen ist Insertionsort schneller als Mergesort

→ verwende Insertionsort wenn hi - lo klein

I Breche Merge-Schritt direkt ab, falls Positionen lo bis hi bereits vollst¨ andig sortiert

if array[mid] <= array[mid + 1]:

return

I Kopieren von tmp-Ergebnis in merge kostet Zeit

→ tausche Rolle von array und tmp

→ bei jedem rekursiven Aufruf

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 14 / 23

A4. Sortieren II: Mergesort Top-Down-Mergesort

Merge-Schritt: Korrektheit

I Invariante: Am Ende jeder Schleifeniteration ist I tmp[k] ≤ array[m] f¨ ur alle i ≤ m ≤ mid, und I tmp[k] ≤ array[n] f¨ ur alle j ≤ n ≤ hi.

I tmp wird von vorne nach hinten beschrieben.

I Nach letzter Schleifeniteration gilt f¨ ur alle lo ≤ r < s ≤ hi, dass tmp[r]≤tmp[s ] (= Bereich ist sortiert).

A4. Sortieren II: Mergesort Top-Down-Mergesort

Mergesort: Korrektheit

sort aux:

I Induktionsbeweis ¨ uber Bereichsl¨ ange hi − lo I Basis hi − lo = −1: leerer Bereich ist sortiert.

I Basis hi − lo = 0: Bereich mit nur einem Element ist sortiert.

I Induktionshypothese: Mergesort ist korrekt f¨ ur alle hi − lo < m I Induktionsschritt (m − 1 → m):

Mergesort macht zwei rekursive Aufrufe mit

hi − lo ≤ m/2 + 1, danach ist die Eingabe jeweils zwischen lo und mid und zwischen mid + 1 und hi sortiert (lt. Ind.-hyp).

Wir wissen bereits, dass der Merge-Schritt korrekt ist, also ist am Ende der gesamte Bereich zwischen lo und hi sortiert.

Mergesort: Ruft sort aux f¨ ur gesamten Bereich auf,

Mergesort: daher ist am Ende die gesamte Eingabe sortiert.

(5)

A4. Sortieren II: Mergesort Top-Down-Mergesort

Mergesort: Eigenschaften (slido)

1

def sort(array):

2

tmp = [0] * len(array) # [0,...,0] with same size as array

3

sort_aux(array, tmp, 0, len(array) - 1)

4

5

def sort_aux(array, tmp, lo, hi):

6

if hi <= lo:

7

return

8

mid = lo + (hi - lo) // 2

9

# //: Division mit Abrunden

10

sort_aux(array, tmp, lo, mid)

11

sort_aux(array, tmp, mid + 1, hi)

12

merge(array, tmp, lo, mid, hi)

Welche der folgenden Eigenschaften hat Mergesort?

In-place? Adaptiv? Stabil?

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 17 / 23

A4. Sortieren II: Mergesort Top-Down-Mergesort

Mergesort: Eigenschaften

I nicht in-place: verwendet zus¨ atzlichen Speicherplatz f¨ ur tmp und f¨ ur Aufrufstapel (call stack)

I Zeitbedarf: nicht adaptiv (ausser mit Mergeabbruch-Verbesserung)

genauere Analyse: n¨ achste Woche I stabil: merge pr¨ aferiert array[i],

wenn array[i] gleich array[j].

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 18 / 23

A4. Sortieren II: Mergesort Bottom-Up-Mergesort

A4.4 Bottom-Up-Mergesort

A4. Sortieren II: Mergesort Bottom-Up-Mergesort

Bottom-Up-Version

0 1 2 3 4 5 6

lo = 0 mid = 0 hi = 1

lo = 2 mid = 2 hi = 3

lo = 4 mid = 4 hi = 5

lo = 6 mid = 6 hi = 6 lo = 0

mid = 1 hi = 3

lo = 4 mid = 5 hi = 6 lo = 0

mid = 3

hi = 6

(6)

A4. Sortieren II: Mergesort Bottom-Up-Mergesort

Bottom-Up-Mergesort: Algorithm

iterative Bottom-Up-Version

1

def sort(array):

2

n = len(array)

3

tmp = [0] * n

4

length = 1

5

while length < n:

6

lo = 0

7

while lo < n - length:

8

mid = lo + length - 1

9

hi = min(lo + 2 * length - 1, n - 1)

10

merge(array, tmp, lo, mid, hi)

11

lo += 2 * length

12

length *= 2

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 21 / 23

A4. Sortieren II: Mergesort Zusammenfassung

A4.5 Zusammenfassung

M. L¨uthi, G. R¨oger (Universit¨at Basel) Algorithmen und Datenstrukturen 4./10. M¨arz 2021 22 / 23

A4. Sortieren II: Mergesort Zusammenfassung

Zusammenfassung

I Mergesort ist ein Teile-und-Herrsche-Verfahren, das den zu sortierenden Bereich in zwei etwa gleich grosse Bereiche teilt.

I Der Merge-Schritt f¨ uhrt zwei bereits sortierte Teilbereiche zusammen.

I Mergesort ist stabil, arbeitet aber nicht in-place.

I Die Top-Down-Variante ist ein rekursives Verfahren.

I Die Bottom-Up-Variante ist ein iteratives Verfahren.

Referenzen

ÄHNLICHE DOKUMENTE

I Insertionsort betrachtet die Elemente von vorne nach hinten und sortiert sie in den bereits sortierten Bereich am.

Mergesort: Ruft sort aux f¨ ur gesamten Bereich auf, Mergesort: daher ist am Ende die gesamte Eingabe sortiert... Wir wissen bereits, dass der Merge-Schritt korrekt ist, also ist

A5.1 Laufzeitanalyse Allgemein A5.2 Beispiel: Selectionsort A5.3 Zusammenfassung.. R¨ oger (Universit¨ at Basel) Algorithmen und

I In der Analyse von Mergesort werden wir eine Logarithmusfunktion verwendet. I Dies ist bei der Analyse von Laufzeiten oft

→ doppelt so grosse Eingabe, etwas mehr als doppelt so lange Laufzeit Was bedeutet das in der PraxisM. I Annahme: c = 1, eine Operation dauert im Schnitt 10

I Beispiel: GTA online hatte viele Jahre eine Ladezeit von mehreren Minuten. I mehrere Minuten zum Parsen von 10

Beispiel: pos0 7→ pos2, pos1 7→ pos1, pos2 7→ pos0 I Da alle m¨ oglichen Eingaben der Gr¨ osse n korrekt gel¨ osst. werden m¨ ussen, muss der Algorithmus

I Insertionsort ist auf kleinen Sequenzen sehr schnell und wird daher zum Beispiel zur Verbesserung von Mergesort und Quicksort f¨ ur kurze Aufrufe eingesetzt.. I Quicksort hat