• Nenhum resultado encontrado

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

EinAlphabetist eine nichtleere endliche Menge vonSymbolen(auchBuchstabengenannt).

EinWortist eine (endliche) Folge von Symbolen. In Programmiersprachen heißen Wörter Strings.

I

Die DatenstrukturString

EineDatenstrukturbesteht 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 Strings

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

Bei 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)