• Nenhum resultado encontrado

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-19

Dielineare 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 Suche

Diebinä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