Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von...

25
Suchen & Sortieren mit Arrays

Transcript of Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von...

Page 1: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Suchen & Sortieren

mit Arrays

Page 2: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von

Listen, bzw. Arrays Komplexität eines Algorithmus‘ Algorithmen entwerfen mit Struktogrammen Iteration & Rekursion Erste Erfahrungen mit Java in NetBeans

Page 3: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Lernziele heute Sie kennen elementare Suchalgorithmen (lineare und

binäre Suche) und können diese erklären, implementieren und bezüglich ihrer Zeitkomplexität bewerten

Sie kennen und verstehen die Begriffe Iteration & Rekursion und können den Unterschied anhand von Implementierungen eines Suchalgorithmus erklären

Sie wissen, was man unter der Komplexität eines Algorithmus‘ versteht, und Sie können diese Komplexität für einfache Beispielalgorithmen und Probleme selbständig abschätzen und Ihr Vorgehen erklären

Page 4: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Array: typ[] name = {Werte}Regal mit gleichartigen Kisten: name[0] Inhalt der ersten Kiste

int[] arr = {3, 5, 0, 17};

System.out.println(arr[3]); // 17arr[1] = 11; // an 2. Stelle 11 statt 5int x = arr[0]; // x ist 3int l = arr.length; // l ist 4

int[] arr = {3, 5, 0, 17};

System.out.println(arr[3]); // 17arr[1] = 11; // an 2. Stelle 11 statt 5int x = arr[0]; // x ist 3int l = arr.length; // l ist 4

Beispiel:

Arrays

Page 5: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Iteration Die Iteration (von lateinisch iterare,

"wiederholen") ist ein Begriff aus der Mathematik und bezeichnet eine Methode, sich der Lösung eines Rechenproblems schrittweise, aber zielgerichtet anzunähern durch wiederholte Anwendung desselben Rechenverfahrens.

In der Informatik wird auch von Iteration gesprochen, wenn man mit allen Elementen eines Arrays arbeiten will und sie dazu nacheinander anspricht, also (mithilfe einer Schleife) durch den Array „iteriert“

Page 6: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Iteration als Struktogramm

Die FOR-Schleife besteht aus einem Verarbeitungsteil und einem Steuerungsteil mit einer Bedingung.

• Die Bedingung bestimmt, ob bzw. wie häufig der Verarbeitungsteil ausgeführt wird, wenn das Programmkonstrukt durchlaufen wird.

Page 7: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Rekursion Rekursion, auch Rekurrenz oder Rekursivität, bedeutet

Selbstbezüglichkeit (von lateinisch recurrere = „zurücklaufen“). Sie tritt immer dann auf, wenn etwas auf sich selbst verweist. Ein rekursives Element muss nicht immer direkt auf sich selbst verweisen (direkte Rekursion), eine Rekursion kann auch über mehrere Zwischenschritte entstehen.

Rekursion kann dazu führen, dass merkwürdige Schleifen entstehen. So ist z.B. der Satz „Dieser Satz ist unwahr“ rekursiv, da er von sich selber spricht. Eine etwas subtilere Form der Rekursion (indirekte Rekursion) kann auftreten, wenn zwei Dinge gegenseitig aufeinander verweisen. Ein Beispiel sind die beiden Sätze: „Der folgende Satz ist wahr“ und „Der vorhergehende Satz ist nicht wahr“.

Page 8: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Rekursion zur Problemlösung Als Rekursion bezeichnet man den Aufruf oder

die Definition einer Funktion durch sich selbst. Ohne geeignete Abbruchbedingung geraten solche rückbezüglichen Aufrufe in einen so genannten infiniten Regress (umgangssprachlich Endlosschleife).

In vielen Fällen ist die Rekursion eine von mehreren möglichen Problemlösungsstrategien, sie führt oft zu „eleganten“ mathematischen Lösungen.

Page 9: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Rekursion als Struktogramm

Unter Rekursion versteht man ein LÖSUNGSVERFAHREN, in der Mathematik und Informatik, bei dem ein Problem derart gelöst wird, dass man es auf das selbe, aber etwas vereinfachte Problem zurückführt.

9

Page 10: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Wesentliche Bestandteile einer Rekursion Die Abbruchbedingung gibt an, welche Bedingung erfüllt sein muss, damit das Lösungsverfahren beendet wird.Die Reduktion gibt an, wie ein Problem auf ein gleichartiges, aber einfacheres Problem zurück zu führen ist.

10

ABBRUCHBEDINGUNG

REDUKTION

SELBSTAUFRUF

Page 11: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Teile & Herrsche (divide & conquer) Falls ein Problem für eine direkte Lösung zu umfangreich

ist, dann: teile das Problem in mindestens zwei, ungefähr gleich grosse

Teilprobleme (divide). löse die kleineren, einfacheren Teilprobleme (elementare Probleme) auf

die gleiche Art (conquer). füge die Teillösungen zu einer Gesamtlösung zusammen (merge)

Teile und herrsche“ ist eines der wichtigsten Prinzipien für effiziente Algorithmen. Dabei wird ausgenutzt, dass bei vielen Problemen der Lösungsaufwand sinkt, wenn man das Problem in kleinere Teilprobleme zerlegt ( reduzierte Komplexität). Dies lässt sich meist durch Rekursive Programmierung umsetzen.

http://de.wikipedia.org/wiki/Teile_und_herrsche_%28Informatik%29

Page 12: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexität (Zeitkomplexität) Unter der Zeitkomplexität eines Problems versteht man

die Anzahl der Rechenschritte, die ein optimaler Algorithmus zur Lösung dieses Problems benötigt, in Abhängigkeit von der Länge der Eingabe. Man spricht hier auch von der asymptotischen Laufzeit und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Es interessiert also nicht der Zeitaufwand eines konkreten Programms auf einem bestimmten Computer, sondern viel mehr, wie der Zeitbedarf wächst, wenn mehr Daten zu verarbeiten sind, also z.B. ob sich der Aufwand für die doppelte Datenmenge verdoppelt oder quadriert (Skalierbarkeit).

Page 13: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Machbarkeitsüberlegungen Angenommen:

Im Test zeigt sich, dass ein Programm für 10 Datenwerte 1 sec benötigt Wenn der Algorithmus Komplexität O(f(n)) hat,

wie viele Eingabedaten kann er in 1 Tag, 1 Jahr, 10 Jahren, 1000 Jahren verarbeiten?

Page 14: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Laufzeitabschätzung

Wir betrachten, wie viele Schritte im Algorithmus abgearbeitet werden müssen - abhängig von der Menge der Eingabedaten.

Beispiel 1:Wir haben eine Namensliste und wollen wissen, ob ein bestimmter Name darin vorkommt. und jetzt?

Kerim Alexandra LorenzJulianSamuelNirubanAymarJoëlSlavkoManuelNathanaelAnselmNiko

Page 15: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Laufzeitabschätzung

1) Lösung (Algorithmus) finden

2) Für den ungünstigsten Fall (worst

case) durchspielen

3) Laufzeit abschätzen (O-Notation)

Kerim Alexandra LorenzJulianSamuelNirubanAymarJoëlSlavkoManuelNathanaelAnselmNiko

Page 16: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Algorithmus Lineare Suche

• Worst case?• Laufzeit

– n = 10?– n = 20?– n = 100?– allgemein?

O(n)(n verdoppeln ver-

doppelt Laufzeit)

Page 17: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Algorithmus Binäre Suche

• Worst case?• Laufzeit

– n = 10?– n = 20?– n = 100?– allgemein?

O()

Page 18: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Laufzeitabschätzung

Wir betrachten, wie viele Schritte im Algorithmus abgearbeitet werden müssen - abhängig von der Menge der Eingabedaten.

Beispiel 2:Wir haben eine Namensliste und wollen wissen, ob ein Name darin doppelt vorkommt.

Kerim Alexandra LorenzJulianSamuelNirubanAymarJoëlSlavkoManuelNathanaelAnselmNiko

Allgemeine Laufzeit?

Page 19: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

O-Notation

Wir betrachten, wie sich die Schrittanzahl im Algorithmus für eine sehr grosse Anzahl von Eingabedaten verhält („obere Schranke“ für Worst Case).

Beispiel Namensliste:Für n Eingabedaten brauchen wir sicher nicht mehr als

(n-1)+(n-2)+…+(1) = Schritte.

Schreibweise:Laufzeit_Namensliste = O(n2)

2

)1( nn

Page 20: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

O-Notation

Vereinfachungsregeln:

Addition f(n) = n + 3 ⇒ O(n)

f(n) = n2 + 3n O⇒ (n2)

Multiplikation f(n) = 3n ⇒ O(n)

f(n) = n2 * 3n ⇒ O(n3)

Konstante Summanden werden vernachlässigt

Es zählt der Summand mit dem stärkeren Wachstum Konstante Faktoren werden vernachlässigt

Es zählt die Summe der Exponenten

Page 21: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexitätsabschätzung worst-case complexity

die Betriebsmittel, die maximal zur Ausführung eines Algorithmus benötigt werden.

average-case complexity durchschnittlicher Betriebsmittelbedarf für alle

Eingaben. Dieser wird als Komplexität des Algorithmus im Durchschnittsfall bezeichnet.

best-case complexity Betriebsmittelbedarf im günstigsten Fall

Page 22: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexitätsklassen O(2n) : Klasse aller exponentiellen Algorithmen

Algorithmen, die ihre Lösung durch systematisches Ausprobieren finden Beispiel: Wie packt man möglichst viele verschieden große Quader in einen Waggon? Hoffnungslos ineffizient für große n

O(nk) : Klasse aller polynomialen Algorithmen Gelten als „noch praktikable“ Algorithmen

O(n2) : Klasse aller quadratischen Algorithmen Einfache Sortieralgorithmen sind quadratisch (bubbleSort, insertionSort, selectionSort)

O(n*log(n)) : loglineare Algorithmen Gute Sortieralgorithmen sind loglinear (quickSort )

O(n) : Klasse aller linearen Algorithman sehr gut behandelbare Algorithmen Beispiel: lineare Suche

O(log(n)) : logarithmische Algorithmen Extrem effizient Beispiel: binäre Suche

O(1) : Klasse aller konstanten Algorithmen Laufzeit unabhängig von Datengrösse

Page 23: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexitätsklassen

Page 24: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexitätsklassen

noch praktikabelnicht mehr praktikabel

Page 25: Suchen & Sortieren mit Arrays. Inhalte Die wichtigsten Algorithmen zum Suchen & Sortieren von Listen, bzw. Arrays Komplexität eines Algorithmus Algorithmen.

Komplexität von Suchalgorithmen Bei der Linearen Suche ist es egal, ob der Datenbestand

schon sortiert ist, oder nicht: n Datenzugriffe für eine erfolglose Suche (worst case) 1 Datenzugriff im best case (sehr unwahrscheinlich) im Mittel (average case) n/2 Dateizugriffe

Lineare Suche: O(n) Die Binäre Suche funktioniert nur mit sortierten Daten:

kann iterativ oder rekursiv implementiert werden 1 Listenspaltung mehr für doppelte Länge

Binäre Suche: O(log(n)) Interpolationssuche: O(log(log(n))