• Nenhum resultado encontrado

L A TEX

16.2 Sortieralgorithmen

16.2.3 Insertion-Sort

16-19 Der Insertion-Sort-Algorithmus 16-19

Idee

Wir halten den ersten Teil des Arrays immer sortiert. Um den sortierten Teil des Arrays um ein Element zu erweitern, tauschen wir dies so lange nach links, bis es am Ziel angekommen ist.

Regie Sortieren von Spielkarten nach dem Insertion-Sort-Algorithmus. Regie

16-20 Insertion-Sort 16-20

static void insertionSort (int[] array) {

for (int pos = 1; pos < array.length; pos++) { int i = pos-1;

while (i >= 0 && array[i] > array[i+1]) {

swap(array,i,i+1);

i = i - 1;

} } }

16-21 Ablauf von Insertion-Sort an einem Beispiel 16-21

Der zu sortierende Array seiarray == {4,3,2,5,1}.

1

i=0 pos=1

2

i=1 pos=2

3

i=0 pos=2

4

i=2 pos=3

5

i=3 pos=4

6

i=2 pos=4

7

i=1 pos=4

8

i=0 pos=4

9

pos=4

16-22 Vor- und Nachteile von Insertion-Sort 16-22

Vorteile

+ Einfach zu verstehen.

+ Sehr schnell bei sortierten und fast sortierten Daten.

+ In-place und stabil.

Nachteile

Bei zufälligen Daten viele Vergleiche und Vertauschungen.

16-23 . Zur Übung 16-23

Bei einem Array der Längen, wie viele

1. Vergleiche macht Insertion-Sort mindestens (grob)?

2. Vergleiche macht Insertion-Sort höchstens (grob)?

3. Vertauschungen macht Insertion-Sort mindestens (grob)?

4. Vertauschungen macht Insertion-Sort höchstens (grob)?

138 16 Sortieralgorithmen

Zusammenfassung dieses Kapitels

16.3 *Untere Schranke für die Vergleichszahl

16-24 Wie viele Vergleiche werden mindestens benötigt? 16-24

Bubble-, Insertion- und Selection-Sort benötigten grobn2/2 Vergleiche im schlimmsten Fall. Dies ist nicht optimal, Merge-Sort benötigt lediglichgrobnlog2nVergleiche. Man kann sicherlich nicht mit weniger als mitn−1Vergleichen auskommen. Wie viele Vergleiche benötigt also einoptimalerAlgorithmus?

16-25 Die untere Schranke für die Anzahl der Vergleiche. 16-25

I

Satz

Jeder Sortieralgorithmus, der lediglich Vergleiche zum Sortieren nutzt, benötigt mindestens nlog2neVergleiche, umnWerte zu sortieren.

Sortieralgorithmen wie Merge-Sort sind also optimal.

16-26 Beweis der unteren Schranke 16-26

Sei Aein beliebiges Sortieralgorithmus. Für jede Permutation π der Zahlen von 1 bis n betrachten wir die Folge der Vergleiche, die der Algorithmus durchführt. Jeder Vergleich liefert entweder »kleiner« oder »größer«; jede Antwortfolge entspricht also einem Bitstring.

Sind zwei Permutationen unterschiedlich, so muss die Folge der gelieferten Antworten auf die Vergleiche unterschiedlich sein.

Es gibtn!Permutationen, aber nur2l+1−1Bitstrings der Länge höchstensl. Es muss also, damit alle Permutationen durch einen anderen Bitstring repräsentiert werden, gelten:

2l+1−1≥n!.

Dies liefert

l≥log2(n!+1)−1.

Die Stirling-Approximation der Fakultät liefert nun l≥log2

2πnn e

n

+1

−1≥nlog2n e.

Zusammenfassung dieses Kapitels

16-27

I

Sortieren 16-27

Sortierenist das Problem, für eine Liste von Objekten einePermutationzu finden, so dass sie in monoton wachsender Reihenfolge sind. Man muss mindestensnlog2(n/e)Vergleiche durchführen, umnObjekte zu sortieren. Die Algorithmen Bubble-Sort, Selection-Sort und Insertion-Sort benötigen alle schlimmstenfalls mindestensn2/2Vergleiche.

I

Bubble-Sort

So lange noch zwei Objekte nebeneinander in der falschen Reihenfolge sind, vertausche sie.

I

Selection-Sort

Für alle Positionenitue nacheinander: Finde das kleinste Element ab Positioniund tausche es an Stellei.

I

Insertion-Sort

Für alle Positionenitue nacheinander: Tausche das Element an Stelleiso lange mit seinen Vorgängern, bis die Element von1bisiin sortierter Reihenfolge sind.

16 Sortieralgorithmen

16.4 Übungen zu diesem Kapitel 139

Übungen zu diesem Kapitel

Übung 16.1 Sortieralgorithmen implementieren, schwer Implementieren Sie eine Methode

static void sortieren( int[] heuhaufen, int start, int end )

die das Arrayheuhaufenmit einem der Algorithmen aus der Vorlesung sortiert. Dabei soll allerdings der Algorithmus so erweitert werden, dass das Array nur im Bereichstartbisendsortiert wird. Wie lange rechnet Ihr Sortierverfahren auf dem Zufallsarray von Übung 15.1?

Übung 16.2 Zeitmessung, schwer

Mitlong jetzt = System.currentTimeMillis();können Sie herausfinden, wie viele Millise- kunden seit dem 1. Januar 1970 vergangen sind. Messen Sie damit die Laufzeit Ihres Sortierverfahrens.

Erstellen Sie eine Tabelle, die die Laufzeit für Array-Bereiche der Länge 10, 100, 1000 usw. angibt (so lange Ihr Speicher oder Ihre Geduld reicht).

Prüfungsaufgaben zu diesem Kapitel

Übung 16.3 Sortieralgorithmen verstehen, leicht, typische Klausuraufgabe Gegeben sei ein Array mit folgenden Einträgen:

61,30,36,77

Sortieren Sie das Array mit Bubble Sort, Insertion Sort und Selection Sort. Geben Sie dabei jeweils den Zustand des Arrays nach einem Durchlauf der äußeren Schleife an.

140 17 Komplexität von Problemen

17-1 17-1

Kapitel 17

Komplexität von Problemen

Werden wir die Lösung in einer Sekunde oder in einem Jahr haben?

17-2 17-2

Lernziele dieses Kapitels

1. Das Laufzeitverhalten der wichtigsten Algorithmen kennen

2. Das Laufzeitverhalten einfacher Programme abschätzen können

3. Die Gruppierung von Problemen nach groben Laufzeitklassen verstehen

Inhalte dieses Kapitels

17.1 Die Laufzeit von Programmen 141 17.1.1 Welches Verfahren ist schneller? . . . . 141 17.1.2 Laufzeitbestimmung I . . . 141

17.2 O-Klassen 142

17.2.1 Idee . . . 142 17.2.2 Definition . . . 142 17.2.3 Laufzeitbestimmung II . . . 144 17.3 Einfache und schwierige Probleme 144 17.3.1 Einfache Probleme . . . 144 17.3.2 Schwierige Probleme . . . 145

Übungen zu diesem Kapitel 146

Worum es heute geht

Worum es heute geht

Bis jetzt ist unser Repertoire an Algorithmen zwar noch etwas bescheiden, aber eines zeich- net sich schon ab: Unterschiedliche Algorithmen für ein und dasselbe Problem können unter- schiedlich schnell sein. Dabei sind absolute Aussage wie »Binäre Suche ist immer schneller als Linear Suche« in der Regel falsch, denn bei manchen Eingaben ist der eine Algorithmus schneller, bei anderen der andere.

In diesem Kapitel finden Sie eine kleine Einführung in die Theorie der Geschwindigkeit von Algorithmen. Ziele dieser Theorie sind:

1. Sie soll möglichst unabhängig von konkreter Hardware sein. Dass ein Supercomputer Zahlen schneller sortiert als Ihr Telefon, ist wenig überraschend und sagt auch wenig darüber aus, wie schnell ein bestimmter Algorithmus ist.

2. Sie soll ein allgemeines Bild von der Geschwindigkeit eines Algorithmus liefern. Dass ein Algorithmus bei bestimmten Spezialfällen sehr gut funktioniert, ist zwar schön für den Algorithmus und man kann ihn dafür auch belobigen, jedoch sagt dies wiederum wenig über sein allgemeines Verhalten aus.

Es hat sich herausgestellt, dass die so genannteO-Notationbesonders geeignet ist, die Ge- schwindigkeit von Algorithmus zu beschreiben. Grob gesprochen bedeutet »der Algorith- mus hat LaufzeitO(n2)«, dass er bei Eingaben der Größengrobn2Rechenschritte benötigt unabhängig von der Hardware.

Gibt es eigentlich noch andere interessante »Ressourcen« bei Algorithmen außer derZeit? Nicht ganz unwichtig ist ebenfalls der Speicherbedarf: Eina = new int[100000000] ist schnell hingeschrieben, der Rechner muss jetzt aber erstmal sehen, wo er die angeforderten 400 Megabyte herzaubert. Trotzdem ist die Geschwindigkeit eines Algorithmus seine mit Abstand wichtigste Eigenschaft, denntime is money. Wir werden in dieser Veranstaltung nur die Zeit als »kritische Eigenschaft« untersuchen.

17 Komplexität von Problemen