L A TEX
11.2 Algorithmen auf Zeichenketten
11.2.4 Intelligentes Suchen
11-20 Die Idee hinter dem (vereinfachten) Boyer-Moore-Algorithmus. 11-20
Problem des naiven Suchens
Suchen eines Strings der Längemin einem Text der Längendauertn·mSchritte.
Idee
Vergleich am Ende beginnen!
s == Sehr geehrte Damen und Herren und
und und
und und
und und
und
11-21 Der vereinfachte Boyer-Moore-Algorithmus 11-21
Input: Ein Stringsund ein Suchstringsuch_mich. Frage: Istsuch_michals Teilstring insenthalten?
Solange noch nicht gefunden tue:
1. Vergleichsuch_michim aktuellen Fenster von hinten mits.
2. Falls nicht gleich:
– Betrachte letztes Zeichen vonsim Fenster, an dem sichsuch_michundsun- terscheiden.
– Schiebe das Fenster so weit vor, dass das letzte Vorkommen dieses Zeichens in dem Stringsuch_michauf diesem Zeichen liegt.
Zusammenfassung dieses Kapitels
11-22
I
Alphabete, Wörter und Strings 11-22EinAlphabetist eine nichtleere endliche Menge vonSymbolen(auchBuchstabengenannt).
EinWortist eine (endliche) Folge von Symbolen. In Programmiersprachen heißen Wörter Strings.
I
Die DatenstrukturStringEineDatenstrukturbesteht aus eineDatentypzusammen mitOperationen.
Bei Strings: Der DatentypStringenthält alle Worte über dem Unicode. Die wichtigsten Operationen sind dieVerkettung (+)sowie
– s.equals(t)zum Vergleichen von Stringssundt, – s.length()zum Bestimmen der Länge vonsund
– s.charAt(i)zur Bestimmung des Zeichens an deri-ten Stelle vons.
I
Schleifen über StringsWill man in einem String für alle Zeichen »etwas tun«, so benutzt man dazu eine Schleife:
String s = ...;
for (int i = 0; i < s.length(); i = i+1) { ... // tue etwas mit s.charAt(i)
}
I
Naive SucheBei dernaiven Suchebenutzt man (grob) obige Schleife, um für jede Stelle eines Strings zu testen, ob dort ein anderer String beginnt.
11 Zeichenketten
11.3 Übungen zu diesem Kapitel 97
Übungen zu diesem Kapitel
Übung 11.1 Stringverarbeitung üben, mittel
Schreiben Sie ein Programm, das zu einer Nukleotidsequenz die komplementäre Sequenz ausgibt:
String sequenz = "tcctat";
String komplement = ""; // enthaelt am Ende die komplementaere // Sequenz, hier z.B. aggata
Prüfungsaufgaben zu diesem Kapitel
Übung 11.2 Zeichen zählen, leicht, typische Klausuraufgabe, mit Lösung
Schreiben Sie eine Methodecountchar, die die Anzahl der Vorkommen eines Zeichenscin einem Stringszählt und zurückgibt! Zum Beispiel:
Eingabes Eingabec Ergebnis
"INFORMATIK" ’I’ 2
"dampfschifffahrt" ’f’ 4
"Achtung" ’k’ 0
int countChar( String s, char c) { int counter = 0;
for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == c) {
counter++;
} }
return counter;
}
Übung 11.3 Verschlüsselung, mittel, original Klausuraufgabe, mit Lösung
Erkennen Sie das Wort"NIOFMRTAKI"? Es handelt sich um eine verschlüsselte Version des Wortes
"INFORMATIK". Die Verschlüsselung funktioniert wie folgt: Die ersten beiden Buchstaben werden vertauscht, ebenso die nächsten beiden, dann wieder die darauf folgenden uns so weiter. Hier einige Beispiele:
Eingabes Ergebnis
"JULI" "UJIL"
"Computer" "oCpmture"
"Johannes" "oJahnnse"
Schreiben Sie eine Methode, die diese Verschlüsselung durchführt! Gehen Sie der Einfachheit halber davon aus, dass die eingegebene Zeichenketteseine gerade Länge hat.
String encrypt( String s ) { String enc = "";
for(int i = 0; i < s.length(); i=i+2) { enc = enc + s.charAt(i+1);
enc = enc + s.charAt(i);
}
return enc;
}
Übung 11.4 Primerdesign, schwer, original Klausuraufgabe
Für den Entwurf von Primern ist es notwendig, kurze DNA-Sequenzen zu bestimmen, die einer Menge von Eingabesequenzen möglichst ähnlich sind. Eine Möglichkeit, solche Sequenzen zu ermitteln, be- steht in der Berechnung sogenannter »Konsensstrings«: Gegeben eine Menge gleichlanger Sequenzen (Eingabestrings), wird Stelle für Stelle das Nukleotid bestimmt, welches an dieser Stelle am häufig- sten vorkommt. Die Aneinanderreihung dieser »Mehrheitsnukleotide« ergibt den Konsensstring. Die komplementäre DNA zum Konsensstring kann dann unter Umständen als Primer verwendet verden.
Die folgende Abbildung erläutert dieses Prinzip, wobei die Mehrheitsnukleotide in den Eingabestrings fett gesetzt sind:
98 11 Zeichenketten
Übungen zu diesem Kapitel
TATAGAAGT TACAGTAGC TACAGAAAT
TACAGAAGT
Eingabestrings
Konsensstring
Ergänzen Sie den Code der folgenden Methode, die den Konsensstring für ein gegebenes Array gleich- langer Sequenzen berechnet! Falls es an einer Stelle nicht eindeutig ist, welches Nukleotid am häufig- sten vorkommt (weil zum Beispiel sowohlTals auchAjeweils 5 mal vorkommen), dann entscheiden Sie sich für einen beliebigen »Gewinner«.
String consensusSequence( String[] sequences ){
if( sequences.length == 0 ){
return "";
}
String consensus = "";
// Ihr Code hier.
return consensus;
}
Übung 11.5 Wörter zählen, mittel, original Klausuraufgabe
Gegeben sei ein String, der aus mehreren durch Leerzeichen getrennten Wörtern besteht, wie zum Bei- spiel"Der Fuchs sprang über den See". Ergänzen Sie den Code der folgenden Methode, die die Anzahl der Wörter im Stringsberechnen und zurückgeben soll.
Sie dürfen davon ausgehen, dass der String außer Wörtern und Leerzeichen keine weiteren Zeichen, wie Punkte oder Kommata, enthält. Beachten Sie aber, dass zwischen zwei Wörtern mehrere Leer- zeichen stehen können, wie zum Bespiel oben zwischen »Fuchs« und »sprang«. Am Anfang und am Ende des Strings können ebenfalls Leerzeichen vorkommen.
int countWords( String s ){
int counter = 0;
// Ihr Code hier.
return counter;
}
Übung 11.6 Iteration über einen String, leicht, original Klausuraufgabe, mit Lösung
Ergänzen Sie den Code der untenstehenden MethodeisRNAString, so dass überprüft wird, ob es sich bei dem Stringsum einen String handelt, der nur aus den Buchstaben a, c, g, u, A, C, G und U besteht. In diesem Fall solltruezurückgegeben werden, sonstfalse.
Hinweis:Sie können Schreibarbeit sparen mit der Methodepublic String toLowerCase()der String-Klasse. Diese Methode wandelt einen String in Kleinbuchstaben um und gibt den umgewan- delten String zurück.
static boolean isRNAString( String s ){
s = s.toLowerCase();
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) != ’a’ || s.charAt(i) != ’c’ || s.charAt(i) != ’g’ ||
s.charAt(i) != ’u’) { return false;
} }
return true;
}
12 Arrays (Felder) 99
12-1 12-1
Kapitel 12
Arrays (Felder)
Nummerierte Bankschließfächer
12-2 12-2
Lernziele dieses Kapitels
1. Konzept des Arrays verstehen.
2. Java-Syntax von Arrays beherrschen.
3. Java-Programme mit Array-Nutzung implementieren können.
Inhalte dieses Kapitels
12.1 Benutzung von Arrays 100
12.1.1 Einführung . . . 100 12.1.2 Array-Typen . . . 101 12.1.3 Erzeugung von Arrays . . . 101 12.1.4 Zugriff auf Arrays . . . 102 12.1.5 Algorithmen auf Arrays . . . 102
12.2 Speicherung von Arrays 103
12.2.1 Verweistypen . . . 103 12.2.2 Zuweisung und Vergleich von
Verweistypen . . . 104
Übungen zu diesem Kapitel 105
Worum es heute geht
Worum es heute geht
Verglichen mit einem einzelnen Zeichen (einemchar) ist ein String wesentlich aufregender.
Mit einzelnen Zeichen kann man nicht sonderlich viel anfangen: Man kann sie ausgeben, sie einlesen und wenn man möchte auch vergleichen, dann hört es aber auch schon wieder auf. Wie viel mehr ist mit Strings möglich: Man kann in ihnen suchen, sie umdrehen, zer- hacken, zusammenfügen, durcheinanderwirbeln, verschlüsseln, trimmen, vergleichen, ein- lesen, ausgeben, verrücken und noch vieles mehr. Zeichen werden eigentlich überhaupt erst interessant, wenn man sie zu ganzen Ketten zusammenstellt.
Wie steht es nun mit Zahlen (einemintoderfloat)? Mit einer einzelnen Zahl kann man schon wesentlich mehr anstellen als mit einem einzelnen Zeichen. Bekanntermaßen küm- mert sich ein ganzer Teilzweig der Mathematik, die Zahlentheorie, liebevoll um die viel- fältigen Eigenschaften von einzelnen Zahlen. Wie viel aufregender müssen die Dinge dann erst werden, wenn wir Zahlen zu Ketten zusammenfügen? Eine solche »Kette von Zahlen«
werden wir im Folgenden einenArraynennen, genaugenommen einenInteger-Array. Arrays kennen Sie schon, auch wenn Ihnen das noch niemand verraten hat: Das, was Sie in der Mathematik alsVektorkennengelernt haben, ist aus Sicht der Informatik ein Array von Zahlen. Das, was Sie in der Mathematik alsMatrixkennengelernt haben, ist aus Sicht der Informatik ein zweidimensionaler Array von Zahlen, genauer ein Array von Arrays von Zahlen.
Arrays kann man nicht nur von Zahlen bilden. Allgemein kann man fürjeden Typ einen Array von Elementen dieses Typs bilden. Dieser enthält dann ein erstes Element, ein zweites Element, ein drittes Element und so weiter bis zu einem letzten,n-ten Element, wobeindie Längedes Arrays bezeichnet.
In der Mathematik würde man die, sagen wir, dritte Komponente eines Vektors xtypi- scherweise mitx3bezeichnen. Da tiefgestellte Indizes auf herkömmlichen Tastaturen etwas schwierig einzugeben sind, benutzt man in der Informatik typischerweise eine andere No- tation: Man stellt den Index in eckige Klammern hinter den Array, alsox[2]. Dies ist kein Tippfehler: DasdritteElement des Arrays erhält man über den Index2, denn die Zählung
100 12 Arrays (Felder)