L A TEX
15.3 Binäre Suche
15-11 Codon zu Aminosäure Umrechnung. 15-11
static String codonToAcid(String codon) {
String[] codonArray = {
"UUU","UUC","UUA","UUG","UCU","UCC","UCA","UCG",
"UAU","UAC","UAA","UAG","UGU","UGC","UGA","UGG",
"CUU","CUC","CUA","CUG","CCU","CCC","CCA","CCG",
"CAU","CAC","CAA","CAG","CGU","CGC","CGA","CGG",
"AUU","AUC","AUA","AUG","ACU","ACC","ACA","ACG",
"AAU","AAC","AAA","AAG","AGU","AGC","AGA","AGG",
"GUU","GUC","GUA","GUG","GCU","GCC","GCA","GCG",
"GAU","GAC","GAA","GAG","GGU","GGC","GGA","GGG"};
String[] acidArray = {
"Phe","Phe","Leu","Leu","Ser","Ser","Ser","Ser",
"Tyr","Tyr","Stp","Stp","Cys","Cys","Stp","Trp",
"Leu","Leu","Leu","Leu","Pro","Pro","Pro","Pro",
"His","His","Gln","Gln","Arg","Arg","Arg","Arg",
"Ile","Ile","Ile","Met","Thr","Thr","Thr","Thr",
"Asn","Asn","Lys","Lys","Ser","Ser","Arg","Arg",
"Val","Val","Val","Val","Ala","Ala","Ala","Ala",
"Asp","Asp","Glu","Glu","Gly","Gly","Gly","Gly"};
return
acidsArray[linearSearch(codonArray, codon)];
}
15-12 . Zur Übung 15-12
Schreiben Sie eine Methode, die eine Aminosäure als Eingabe erhält undalleCodons zu dieser Aminosäure auf dem Bildschirm ausgibt.
(Für Fortgeschrittene: Wie können Sie alle Codons in einem Array zurückgeben?)
15.3 Binäre Suche
15.3.1 Idee
15-13 Die Grundidee der binären Suche. 15-13
Beobachtung
Suchen wir einen Namen im Telefonbuch, so suchen wir diesen natürlich nicht linear. Viel- mehr fangen wir grob in der Mitte an und gehen dann sprungweise nach vorne oder nach hinten.
Binäre Suche
Binäre Suche arbeitet aufsortiertenArrays. Manhalbiertzu Anfang den Suchraum in der Mitte. Dann behandelt man nur noch eine der beiden Seiten.
15.3.2 Implementation
15-14 Beispiel einer binären Suche. 15-14
String[] names =
{"Alice", "Bob", "Charly", "Doris", "Till", "Viktor"};
// Binäre Suche nach "Till":
int lower_bound = 0;
int upper_bound = names.length - 1;
while (lower_bound != upper_bound) {
int mid_point = (lower_bound + upper_bound) / 2;
if (names[mid_point] < "Till") {// geschummelt lower_bound = mid_point + 1;
15 Suchalgorithmen
15.3 Binäre Suche 129
} else {
upper_bound = mid_point;
} }
return lower_bound;
15-15 Beispiel einer binären Suche. 15-15
1
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
2
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
3
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
4
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
5
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
6
Alice Bob Charly
Doris Till Viktor names
upper_bound mid_point lower_bound
15-16 Eine allgemeine binäre Suche. 15-16
class SearchAlgorithms {
static int binarySearch(String[] array, String value) {
// Finde Vorkommen von value in array (sortiert).
int lower_bound = 0;
int upper_bound = array.length - 1;
while (lower_bound != upper_bound) {
// Berechne Mitte des Intervals
int mid_point = (lower_bound + upper_bound) / 2;
if (array[mid_point].compareTo(value) < 0) { // Im oberen Interval, erhöhe untere Schranke lower_bound = mid_point + 1;
}
else { // Unteres Interval, senke obere Schranke upper_bound = mid_point;
130 15 Suchalgorithmen
Zusammenfassung dieses Kapitels
} }
return lower_bound;
} }
15.3.3 Laufzeit
15-17 . Zur Übung 15-17
Wie viele Vergleiche führt die MethodebinarySearchbei einem Array der Längen
1. mindestens,
2. höchstens und
3. im Durchschnitt aus?
15.3.4 Vorsortierung
15-18 Vorsortierung ist nützlich, wenn öfters gesucht werden soll. 15-18
Binäre Suchefunktioniert nurauf sortierten Daten. Will man unbedingt binäre Suche ver- wenden, so kann man die Datenvorsortieren. Das Sortieren von Daten dauert aber (wesent- lich) länger alseinelineare Suche. Sind die Daten aber einmal sortiert, gehennachfolgende binäre Suchen schnell.
Folgerung
Vorsortieren lohnt sich nur, wenn in den Datenmehrmalsgesucht werden soll.
(Genauer: Vorsortieren lohnt sich ab etwalog2nSuchen.)
Zusammenfassung dieses Kapitels
15-19
I
Lineare Suche 15-19Dielineare Suchedurchläuft einfach alle Elemente. Das Wesentliche ist folgende die Schlei- fe:
for (int i = 0; i < values.length; i++) { if (values[i] == what_we_search_for) {
return i;
} }
Die lineare Suche benötigt im Schnittn/2Vergleiche bei Arrays der Längen.
I
Binäre SucheDiebinäre Suchespringt in einemsortiertenArray herum. Das Wesentliche ist folgende die Schleife:
while (lower_bound != upper_bound) {
int mid_point = (lower_bound + upper_bound) / 2;
if (values[mid_point] < what_we_search_for) { lower_bound = mid_point + 1;
} else {
upper_bound = mid_point;
} }
Die binäre Suche benötigtlog2nVergleiche, wassehr schnell ist.
15 Suchalgorithmen
15.4 Übungen zu diesem Kapitel 131
Übungen zu diesem Kapitel
Zum Test der folgenden Aufgabe ist es sinnvoll, einen großen Arrays von Zufallszahlen zu besitzen.
Einen solchen kann man wie folgt erzeugen:
static int[] zufallszahlen = new int [10000000];
for (int i = 0; i < zufallszahlen.length; i++) { zufallszahlen[i] = (int) (Math.random() * 1000);
}
// In zufallszahlen sind nun 10.000.000 Zahlen zwischen 0 und 999
Übung 15.1 Suchalgorithmen implementieren, mittel Implementieren Sie mit zwei Java Methoden
static int lineare_suche( int nadel, int[] heuhaufen ) static int binaere_suche( int nadel, int[] heuhaufen )
die beiden bekannten Suchalgorithmen aus der Vorlesung. Beide Methoden sollen den Index des Werts nadelim Arrayheuhaufenzurückgeben, wenn dieser dort gefunden werden kann. Ansonsten soll -1zurückgegeben werden.
Wenden Sie die Methoden auf das opben genannte Zufallsarray an und such Sie dort nach der Zahl 555. Wie lange dauert das ungefähr?
Übung 15.2 Suchalgorithmen implementieren, mittel Ihr persönliches Telefonbuch ist in zwei Arrays gespeichert:
static String[] personen =
{Till, Johannes, Markus, Claudia, ...};
static String[] nummern = {5311, 5313, 5314, 5300, ...};
Schreiben Sie ein Methode, das den Namen einer Person als Parameter bekommt und das dann die Telefonnummer dieser Person auf dem Bildschrim ausgibt.
Prüfungsaufgaben zu diesem Kapitel
Übung 15.3 Binäre Suche verstehen, leicht, typische Klausuraufgabe Gegeben sei ein Array mit folgenden Einträgen:
12,14,27,33,56,58,63,70,75,82,89,89,90,91,92
Geben Sie die Vergleiche an, die bei einer binären Suche in diesem Array nach dem Element58 durchgeführt werden!
132 16 Sortieralgorithmen
16-1 16-1
Kapitel 16
Sortieralgorithmen
Skat, das Telefonbuch und Atome
16-2 16-2
Lernziele dieses Kapitels
1. Arten von Sortierproblemen kennen
2. Bubble-Sort, Insertion-Sort, Selection-Sort verstehen und implementieren können
Inhalte dieses Kapitels
16.1 Die Problemstellung 133
16.1.1 Motivation . . . 133 16.1.2 Problemvarianten . . . 133
16.2 Sortieralgorithmen 134
16.2.1 Bubble-Sort . . . 134 16.2.2 Selection-Sort . . . 135 16.2.3 Insertion-Sort . . . 137 16.3 *Untere Schranke für die Vergleichszahl 138
Übungen zu diesem Kapitel 139
Worum es heute geht
Worum es heute geht
Wie wir schon im vorherigen Kapitel gesehen haben, ist der zweite Hauptsatz der Ther- modynamik für Computer ein echtes Problem: Ständig wird alles unordentlich. Man kann sich, wie im letzten Kapitel geschehen, damit behelfen, ständig in den Daten im Speicher herumzusuchen. Wir haben aber auch gesehen, dass eine solche Suche besonders schnell geht, wenn die Daten sortiert – also wohlgeordnet – sind. Damit beißt sich die Katze in den Schwanz: Weil die Daten nicht sortiert sind, müssen wir suchen; aber um schnell zu suchen, müssen die Daten sortiert sein.
Um diesen mehr oder weniger gordischen Knoten zu durchschlagen, brauchen wirSortieral- gorithmen. Diese bekommen einen Array von Zahlen oder Dingen als Eingabe und ändern die Reihenfolge der Elemente des Arrays derart, dass hinterher alles schön sortiert ist. Da- nach fällt uns auch das Suchen viel leichter.
Das Sortieren von Zahlen ist schwieriger als das Suchen nach Zahlen. Dies ist zum einen ein Unglück, denn man muss komplexere Algorithmen lernen, diese sind schwieriger zu programmieren und sie sind langsamer als Suchalgorithmen. Aus Sicht Theoretischer In- formatiker ist es hingegen ein Glück, denn so kann man viel mehr forschen, veröffentlichen und Drittmittel einwerben. Tatsächlich können Sie auch heute noch Artikel über Sortierver- fahren auf renommierten Konferenzen vorstellen und in renommierten Zeitschriften veröf- fentlichen.
Sortieren lohnt sich nicht immer. Stellen Sie sich Ihren unaufgeräumten Schreibtisch vor.
Sie suchen ein bestimmtes Blatt, von dem Sie wissen, dass es »da irgendwo sein muss«.
Sie könnten nun hingehen und zunächst den ganzen Schreibtisch komplett aufräumen, alles gegebenenfalls abstauben und dann abheften, so dass sie am Ende das gewünschte Blatt mit einem Griff finden werden. In der Regel werden Sie dies aber nicht tun, sondern einfach kurz den Schreibtisch nach dem gesuchten Blatt durchwühlen. Das Aufräumen lohnt sich nur, wenn Sie in den nächsten Tagen ständig unterschiedliche Dinge suchen werden. Ganz ähnlich die Sachlage beim Sortieren von Daten im Rechner: Muss man nur einmalig etwas in den Daten suchen, so lohnt es sich nicht, diese erst zu sortieren. Werden Sie aber immer und immer wieder in den Daten suchen, so empfiehlt sich eine Vorsortierung.
16 Sortieralgorithmen
16.2 Die Problemstellung 133