Effiziente Algorithmen 2

Ähnliche Dokumente
Proseminar "Pattern Matching"

Hallo Welt für Fortgeschrittene

Zeichenketten. Hauptseminar Hallo Welt! für Fortgeschrittene. SS Mai 2006 Tobias Hager.

4 Greedy-Algorithmen (gierige Algorithmen)

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Mächtigkeit von WHILE-Programmen

Algorithmische Bioinformatik

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Einführung in die Programmierung

Bioinformatik. Zeichenketten und Stringalgorithmen. Ulf Leser Wissensmanagement in der. Bioinformatik

Grundbegriffe der Informatik

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

1. Grundlagen Sortieren Vertauschen Selektion Einfügen Quicksort Suchen...

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet

Alignment-Verfahren zum Vergleich biologischer Sequenzen

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Teil 2 - Softwaretechnik. Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 2. Übersicht. Softwaretechnik

13. Binäre Suchbäume

Informatik I WS 07/08 Tutorium 24

Definition Suffixbaum

Programmierkurs Java

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Klausur in Programmieren

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Das Briefträgerproblem

Z 50. Z O Z Int Z Komma Z Real Ziffer Komma Ziffer

IT-Basics 2. DI Gerhard Fließ

Grundlagen Theoretischer Informatik I SoSe 2011 in Trier. Henning Fernau Universität Trier fernau@uni-trier.de

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Informatik Repetitorium SS Volker Jaedicke

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Computational Intelligence

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Funktionale Programmierung mit Haskell

WS 2013/14. Diskrete Strukturen

16. All Pairs Shortest Path (ASPS)

Klausur in Programmieren

Algorithmen II Vorlesung am

Algorithmische Bioinformatik

Abschnitt: Algorithmendesign und Laufzeitanalyse

Programmierung und Modellierung

Einführung in die Informatik I

Fallunterscheidung: if-statement

Propädeutikum zur Programmierung

Steueranweisungen. Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Grundlagen der Theoretischen Informatik, SoSe 2008

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Einführung in die Programmierung für Wirtschaftsinformatik

Dr. Monika Meiler. Inhalt

Dynamische Programmierung

Entwurf von Algorithmen - Kontrollstrukturen

2 Lösungen "Peptide de novo Sequencing"

Wirtschaftsinformatik I

4 Codierung nach Viginere (Lösung)

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Algorithmentheorie Maximale Flüsse

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Sprachbeschreibung und Erweiterung

Algorithmen und Datenstrukturen 2

Shell-Programmierung

Primzahlzertifikat von Pratt

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 2

Präfx Trie zur Stringverarbeitung. Cheng Ying Sabine Laubichler Vasker Pokhrel

Wortproblem für kontextfreie Grammatiken

5. Tutorium zu Programmieren

Pratts Primalitätszertifikat

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Approximationsalgorithmen

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Studentische Lösung zum Übungsblatt Nr. 7

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

Erfüllbarkeit und Allgemeingültigkeit

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

Binäre lineare Optimierung mit K*BMDs p.1/42

Codierung, Codes (variabler Länge)

Gliederung Programmiersprachen. Programmiersprachen Einführung in C. Kontrollstrukturen. Verzweigung mit IF. Beispiel: Zahlenklassifizieren

VBA-Programmierung: Zusammenfassung

Undirected Single-Source Shortest Paths with Positive Integer Weights in Linear Time

Suchen und Sortieren Sortieren. Heaps

Programmierung 2. Dynamische Programmierung. Sebastian Hack. Klaas Boesche. Sommersemester

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

15 Optimales Kodieren

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Modellierung und Programmierung 1

Transkript:

Effiziente Algorithmen 2 Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 2009

Übersicht Algorithmen zur Textsuche 1 Algorithmen zur Textsuche

Alphabet Algorithmen zur Textsuche Definition Ein Alphabet ist eine endliche Menge von Symbolen. Wir bezeichnen es meistens mit Σ. Beispiel Σ = {a, b, c,..., z}, Σ = {0, 1}, Σ = {A, C, G, T }

Wörter Algorithmen zur Textsuche Definition Wörter über Σ sind endliche Folgen von Symbolen aus Σ. Wir notieren Wörter meist in der Form w = w 0 w n 1 oder w = w 1 w n. Beispiel Σ = {a, b}, dann ist w = abba ein Wort über Σ.

Wortlänge, Wortmengen Definition Die Länge eines Wortes w wird mit w bezeichnet und entspricht der Anzahl der Symbole in w. Das Wort der Länge 0 heißt leeres Wort und wird mit ε bezeichnet. Definition Die Menge aller Wörter über Σ wird mit Σ bezeichnet. Die Menge aller Wörter der Länge größer gleich 1 über Σ wird mit Σ + := Σ \ {ε} bezeichnet. Die Menge aller Wörter über Σ der Länge k wird mit Σ k Σ bezeichnet.

Präfix, Suffix, Teilwort Definition Im Folgenden bezeichne [a : b] = {n Z a n n b} für a, b Z. Sei w = w 1 w n ein Wort der Länge n über Σ, dann heißt w Präfix von w, wenn w = w 1 w l mit l [0 : n] w Suffix von w, wenn w = w l w n mit l [1 : n + 1] w Teilwort von w, wenn w = w i w j mit i, j [1 : n] (Für w = w i w j mit i > j soll gelten w = ɛ.) Das leere Wort ε ist also Präfix, Suffix und Teilwort eines jeden Wortes über Σ.

Textsuche Algorithmen zur Textsuche Problem: Gegeben: Text t Σ ; t = n; Suchwort s Σ ; s = m n Gesucht: i [0 : n m] mit t i t i+m 1 = s? (bzw. alle solchen Positionen i)

Algorithmen zur Textsuche Suchwort s wird Buchstabe für Buchstabe mit dem Text t verglichen Stimmen zwei Buchstaben nicht überein ( Mismatch), so wird s um eine Position nach rechts verschoben und der Vergleich von s mit t beginnt von neuem. Vorgang wird wiederholt, bis s in t gefunden wird oder bis klar ist, dass s in t nicht enthalten ist.

Algorithmen zur Textsuche t s 0 n 1 0 m 1

: Beispiel 1 t = a a a a a a a a a a a a a b a a a b a a a b

: Beispiel 2 t = a a b a a b a a b a a b a a b a a b a a a a a b a a a a a b a a a a a b a a a

: Implementation Algorithmus 1 : bool Naiv (char t[], int n, char s[], int m) int i := 0, j := 0; while (i n m) do while (t[i + j] = s[j]) do j ++; if (j = m) then return TRUE; i ++; j := 0; return FALSE;

Match und Mismatch Definition Stimmen zwei Zeichen bei einem Vergleich überein, so nennt man dies ein Match, ansonsten ein Mismatch.

Analyse des naiven Algorithmus zähle Vergleiche von Zeichen, äußere Schleife wird (n m + 1)-mal durchlaufen, die innere Schleife wird maximal m-mal durchlaufen. maximale Anzahl von Vergleichen: (n m + 1)m, Laufzeit: O(nm)

Bessere Idee Algorithmen zur Textsuche frühere erfolgreiche Vergleiche von zwei Zeichen ausnutzen Idee: Suchwort so weit nach rechts verschieben, dass in dem Bereich von t, in dem bereits beim vorherigen Versuch erfolgreiche Zeichenvergleiche durchgeführt wurden, nun nach dem Verschieben auch wieder die Zeichen in diesem Bereich übereinstimmen

Rand und eigentlicher Rand Definition Ein Wort r heißt Rand eines Wortes w, wenn r sowohl Präfix als auch Suffix von w ist. Bemerkung: Für jedes Wort w sind damit immer auch das leere Wort ε und w selbst Ränder von w. Ein Rand r eines Wortes w heißt eigentlicher Rand, wenn r w und wenn es außer w selbst keinen längeren Rand gibt.

Rand und eigentlicher Rand Beispiel Das Wort w =aabaabaa besitzt folgende Ränder: ε a aa aabaa aabaabaa= w Der eigentlichen Rand ist aabaa. Man beachte, dass sich bei der Darstellung eines Rands im Wort das entsprechende Präfix und Suffix in der Mitte des Worts überlappen können.

Shift-Idee Algorithmen zur Textsuche Pattern s so verschieben, dass im bereits gematchten Bereich wieder Übereinstimmung herrscht. Dazu müssen überlappendes Präfix und Suffix dieses Bereichs übereinstimmen. t 0 n 1 s 0 m 1 =

Shifts und sichere Shifts Definition Ein Verschiebung der Anfangsposition i des zu suchenden Wortes (d.h. eine Erhöhung des Index i i ) heißt Shift. Ein Shift von i i heißt sicherer Shift, wenn s nicht als Teilwort von t an der Position k [i + 1 : i 1] vorkommt, d.h. s t k t k+m 1 für alle k [i + 1 : i 1]. Sinn eines sicheren Shifts: dass man beim Verschieben des Suchworts kein eventuell vorhandenes Vorkommen von s in t überspringt.

Sichere Shifts Algorithmen zur Textsuche Definition Sei (s) der eigentliche Rand von s und sei { 1 für j = 0 border[j] = (s 0 s j 1 ) für j 1 die Länge des eigentlichen Rands des Präfixes der Länge j. Lemma Ist das Präfix der Länge j gematcht (also gilt s k = t i+k für alle k [0 : j 1]) und haben wir ein Mismatch an der nächsten Position j (s j t i+j ), dann ist der Shift i i + j border[j] sicher.

Sichere Shifts Algorithmen zur Textsuche Shift um j border[j]: t i i +j 0 i i+j n 1 s 0 j j border[j] 0 j = border[j]

Sichere Shifts Algorithmen zur Textsuche Beweis. (siehe Skizze) s 0 s j 1 = t i t i+j 1, s j t i+j Der eigentliche Rand von s 0 s j 1 hat die Länge border[j]. Verschiebt man s um j border[j] nach rechts, so liegt der linke Rand von s 0 s j 1 nun genau da, wo vorher der rechte Rand lag, d.h. im Präfix/Suffix-Überlappungsbereich besteht Übereinstimmung zwischen Präfix, Suffix und Text. Da es keinen längeren Rand von s 0 s j 1 als diesen gibt (außer s 0 s j 1 selbst), ist dieser Shift sicher.

KMP-Algorithmus Algorithmen zur Textsuche Algorithmus 2 : bool KMP(char t[], int n, char s[], int m) int border[m + 1]; compute_borders(int border[], int m, char s[]); int i := 0, j := 0; while i n m do while t[i + j] = s[j] do j ++; if j = m then return TRUE; i := i + (j border[j]) ; // Es gilt j border[j] > 0 j := max{0, border[j]}; return FALSE;

Laufzeit des KMP-Algorithmus Definition Ein Vergleich von zwei Zeichen heißt erfolgreich, wenn die beiden Zeichen gleich sind (Match), und erfolglos sonst (Mismatch).

Laufzeit des KMP-Algorithmus: erfolglose Vergleiche Nach einem erfolglosen Vergleich wird der Wert von i + j nie kleiner: Seien dazu i und j die Werte vor einem erfolglosen Vergleich und i und j die Werte nach einem erfolglosen Vergleich. Wert vor dem Vergleich: i + j Wert nach dem Vergleich: i + j = (i + j border[j]) + (max{0, border[j]}). Fallunterscheidung: border[j] negativ oder nicht. border[j] < 0 Ist border[j] = 1, dann muss j = 0 sein. Das bedeutet i + j = i + 0 = (i + 0 ( 1)) + 0 = i + 1. border[j] 0 Ist border[j] 0, dann gilt i + j = i + j. Also wird i + j nach einem erfolglosen Vergleich nicht kleiner.

Laufzeit des KMP-Algorithmus: erfolglose Vergleiche Nach jedem erfolglosen Vergleich wird i [0 : n m] erhöht. Im Verlaufe des Algorithmus wird i nie erniedrigt wird. maximal n m + 1 erfolglose Vergleiche

Laufzeit des KMP-Algorithmus: erfolgreiche Vergleiche Nach einem erfolgreichen Vergleich wird i + j um 1 erhöht! Die maximale Anzahl erfolgreicher Vergleiche ist somit durch n beschränkt, da i + j [0 : n 1]. Somit werden insgesamt maximal 2n m + 1 Vergleiche ausgeführt.

Berechnung der border-tabelle In der border[]-tabelle wird für jedes Präfix s 0 s j 1 der Länge j [0 : m] des Suchstrings s der Länge m gespeichert, wie groß dessen eigentlicher Rand ist. Wir initialisieren die Tabelle zunächst mit border[0] = 1 und border[1] = 0. Im Folgenden nehmen wir an, dass border[0],..., border[j 1] bereits berechnet sind. Wir wollen dann den Wert border[j], also die Länge des eigentlichen Randes eines Präfixes der Länge j, berechnen.

Berechnung der border-tabelle s 0 j 1 m 1 s border[j 1] 1!= j 1 m 1 =?

Berechnung der border-tabelle Der eigentliche Rand s 0 s k von s 0 s j 1 kann um maximal ein Zeichen länger sein als der eigentliche Rand von s 0 s j 2, da nach Definition s 0 s k 1 auch ein Rand von s 0 s j 2 ist (oberer Teil der Abbildung). Ist s border[j 1] = s j 1, so ist border[j] = border[j 1] + 1. Andernfalls müssen wir ein kürzeres Präfix von s 0 s j 2 finden, das auch ein Suffix von s 0 s j 2 ist. Der nächstkürzere Rand eines Wortes ist offensichtlich der eigentliche Rand des zuletzt betrachteten Randes dieses Wortes. Nach Konstruktion der Tabelle border ist das nächstkürzere Präfix mit dieser Eigenschaft das der Länge border[border[j 1]].

Berechnung der border-tabelle Nun testen wir, ob sich dieser Rand von s 0 s j 2 zu einem eigentlichen Rand von s 0 s j 1 erweitern lässt. Dies wiederholen wir solange, bis wir einen Rand gefunden haben, der sich zu einem Rand von s 0 s j 1 erweitern lässt. Falls sich kein Rand von s 0 s j 2 zu einem Rand von s 0 s j 1 erweitern lässt, so ist der eigentliche Rand von s 0 s j 1 das leere Wort und wir setzen border[j] = 0.

Algorithmus zur Berechnung der border-tabelle Algorithmus 3 : compute_borders(int border[], int m, char s[]) border[0] := 1; border[1] := 0; int i := 0; for (int j := 2; j m; j ++) do // Beachte, dass hier gilt: i = border[j 1] while (i 0) && (s[i] s[j 1]) do i := border[i]; i ++; border[j] := i;

Laufzeit der Berechnung der border-tabelle Zähle erfolgreiche und erfolglose Ausführungen der while-schleifenbedingung Es kann maximal m 1 erfolgreiche Vergleiche geben, da jedes Mal j [2 : m] um 1 erhöht und nie erniedrigt wird.

Laufzeit der Berechnung der border-tabelle Für die Anzahl erfolgloser Vergleiche betrachten wir den Wert i. Zu Beginn ist i = 0. i wird genau (m 1) Mal um 1 erhöht, da die for-schleife (m 1) Mal durchlaufen wird. Im Fall eines erfolglosen Vergleichs wird i um mindestens 1 erniedrigt. i kann maximal (m 1) + 1 = m Mal erniedrigt werden, da immer i 1 gilt. Es gibt also höchstens m erfolglose Vergleiche. Also ist die Anzahl der Vergleiche durch 2m 1 beschränkt.

Laufzeit des KMP-Algorithmus Theorem Der Algorithmus von Knuth, Morris und Pratt benötigt maximal 2n + m Vergleiche, um festzustellen, ob ein Muster s der Länge m in einem Text t der Länge n enthalten ist. Der Algorithmus lässt sich leicht derart modifizieren, dass er alle Positionen der Vorkommen von s in t ausgibt, ohne dabei die asymptotische Laufzeit zu erhöhen. Donald E. Knuth, James H. Morris, Jr. and Vaughan R. Pratt Fast Pattern Matching in Strings SIAM Journal on Computing 6(2):323 350, 1977.