Pattern Matching. Maik Windhorst Universität Bremen Abstract. 1. Pattern Matching Was ist das?

Ähnliche Dokumente
Effiziente Algorithmen 2

Algorithmische Bioinformatik 1

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Lösungen zu Kapitel 5

String - Matching. Kapitel Definition

Datenstrukturen & Algorithmen

Tutoraufgabe 1 (Suchen in Graphen):

Klausur Informatik B April Teil I: Informatik 3

Studiengang Informatik der FH Gießen-Friedberg. Sequenz-Alignment. Jan Schäfer. WS 2006/07 Betreuer: Prof. Dr. Klaus Quibeldey-Cirkel

Bioinformatik Für Biophysiker

Algorithmen und Datenstrukturen

Lösungen zur 1. Klausur. Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie

Isomorphie von Bäumen

Muster. Informatik 3 (Februar 2004) Name: Matrikelnummer: Betrachten Sie den folgenden Suchbaum. A G H J K M N

WS 2013/14. Diskrete Strukturen

TU München. Hauptseminar: WS 2002 / Einführung in Suffix - Bäume

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Theoretische Grundlagen der Informatik. Vorlesung am 02. November INSTITUT FÜR THEORETISCHE INFORMATIK

Algorithmische Graphentheorie

André Krischke Helge Röpcke. Graphen und Netzwerktheorie Grundlagen Methoden Anwendungen

Diskrete Strukturen Kapitel 4: Graphentheorie (Bäume)

Automaten und Coinduktion

2.2 Der Algorithmus von Knuth, Morris und Pratt

Proseminar String Matching

Algorithmen und Datenstrukturen 1-5. Seminar -

Grundlagen der Informatik

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Klausur WS 2006/07 Software-Engineering und Technische Informatik Bachelor

Theoretische Grundlagen der Informatik

Teil III. Komplexitätstheorie

4.9.7 Konstruktion der Suffixbäume

Vorlesung Datenstrukturen

Graphdurchmusterung, Breiten- und Tiefensuche

Vorlesung 4 BETWEENNESS CENTRALITY

Algorithmen auf Sequenzen

Algorithmische Bioinformatik 1

Algorithmen und Datenstrukturen II

Einleitung. Kapitel 1

Ein deterministischer endlicher Automat (DFA) kann als 5-Touple dargestellt werden:

Einstieg in die Informatik mit Java

Grundbegriffe der Informatik

Helmut Schauer Educational Engineering Lab Department for Information Technology University of Zurich. Graphen (2)

Die Nerode-Relation und der Index einer Sprache L

Backtracking mit Heuristiken

Das Briefträgerproblem

Praktische Grenzen der Berechenbarkeit

Diskrete Strukturen. Hausaufgabe 1 (5 Punkte) Hausaufgabe 2 (5 Punkte) Wintersemester 2007/08 Lösungsblatt Januar 2008

Grundbegriffe der Informatik

Algorithmen auf Zeichenketten

1.8 Shift-And-Algorithmus

Reguläre Grammatiken/Sprachen und endliche Automaten

Bioinformatik Für Biophysiker

11. GRAPHEN 3 FLÜSSE UND SPANNBÄUME

Vorlesung Datenstrukturen

Algorithmen & Komplexität

Electronic Design Automation (EDA) Technology Mapping

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

THIA - Übungsblatt 2.

Übungsblatt 6. Vorlesung Theoretische Grundlagen der Informatik im WS 16/17

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

Algorithmen und Datenstrukturen 2

Unterscheidung: Workflowsystem vs. Informationssystem

Algorithmen und Datenstrukturen 2

Die Komplexitätsklassen P und NP

Diskrete Mathematik. Hamiltonsche Graphen Teil I. Karina Arndt

Algorithmen und Datenstrukturen

Algorithmische Methoden zur Netzwerkanalyse

1 topologisches Sortieren

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

Bipartite Graphen. Beispiele

Uninformierte Suche in Java Informierte Suchverfahren

4. Alternative Temporallogiken

Theoretische Informatik. nichtdeterministische Turingmaschinen NDTM. Turingmaschinen. Rainer Schrader. 29. April 2009

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin

Kapitel 7: Flüsse in Netzwerken und Anwendungen Gliederung der Vorlesung

Algorithmische Anwendungen WS 2005/2006

Graphentheorie. Formale Grundlagen (WIN) 2008S, F. Binder. Vorlesung im 2008S

Graphentheorie. Eulersche Graphen. Eulersche Graphen. Eulersche Graphen. Rainer Schrader. 14. November Gliederung.

WS 2008/09. Diskrete Strukturen

8.4 Suffixbäume. Anwendungen: Information Retrieval, Bioinformatik (Suche in Sequenzen) Veranschaulichung: DNA-Sequenzen

Lösungen zur Vorlesung Berechenbarkeit und Komplexität

Wiederholung zu Flüssen

Das Problem des Handlungsreisenden

WS 2009/10. Diskrete Strukturen

Algorithmen auf Sequenzen Paarweiser Sequenzvergleich: Alignments

Theoretische Informatik 1

Algorithmen. Von Labyrinthen zu. Gerald Futschek

Nichtdeterministische Platzklassen

Einführung in die Informatik 2

Reduktion. 2.1 Abstrakte Reduktion

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Diskrete Mathematik 1

P, NP und NP -Vollständigkeit

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

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

Definition Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u V und v V.

Kapiteltests zum Leitprogramm Binäre Suchbäume

10. Übungsblatt zu Algorithmen I im SS 2010

Kapitel 7: Flüsse in Netzwerken und Anwendungen Gliederung der Vorlesung

Transkript:

Pattern Matching Maik Windhorst Universität Bremen winne@tzi.de Abstract In diesem Dokument soll das Thema Pattern Matching betrachtet werden, insbesondere die Anwendungen im Bereich der Informatik. Dafür werden wir zunächst allgemein klären was Pattern Matching ist und wie es definiert ist. Anschließend wird die einfachste und wahrscheinlich bekannteste Anwendung des Pattern Matching in der Informatik betrachtet, die Sequenzen oder auch Strings. Aufbauend auf dem Wissen das wir aus der Betrachtung der Strings gewonnen haben werden wir Pattern Matching auf Bäumen betrachten. Als letztes das Pattern Matching auf Graphen. In allen drei Anwendungsgebieten werden wir einen genaueren Blick auf die Algorithmen und den benötigten Aufwand werfen. 1. Pattern Matching Was ist das? Um zu beantworten was Pattern Matching ist, ist der einfachste Weg, sich weitere Fragen zu stellen, die durch Pattern Matching beantwortet werden. Wie ähnlich ist ein gegebenes Objekt mit einem oder mehreren anderen Objekten? Intuitiv erscheint diese Frage jedem klar, natürlich sind Äpfel und Birnen überhaupt nicht ähnlich. Nehmen wir das berühmte Beispiel aus der Schule, wenn wir im Physikunterricht einmal vergessen haben die Einheiten mit aufzuschreiben: Was vergleichst du denn da? Äpfel mit Birnen? Allerdings kann die Antwort auch anders lauten, wenn wir den Abstraktionsgrad der Betrachtung erhöhen. Sowohl ein Apfel als auch eine Birne sind Früchte, sie haben beide Kerne, können beide grün sein. So können wir eventuell eine gewisse Ähnlichkeit zwischen beiden erkennen. Und genau das ist Pattern Matching. Wir definieren zunächst ein Muster (Pattern), welches einen beliebigen Abstraktionsgrad haben darf, welcher die Genauigkeit unserer anschließenden Findung (Matching) bestimmt. Eine andere Frage die sich durch Pattern Matching beantworten lässt lautet Welche Objekte sind gleich genug, um vergleichbar zu sein. Wieder können wir auf unser Beispiel von Apfel und Birne nehmen. Manch einer würde sofort sagen, Äpfel und Birnen sind nicht zu vergleichen. Doch durch Anhebung der Abstraktion der Betrachtung können wir diese Aussage erneut relativieren. Natürlich sind beides Obstsorten, die gewisse Eigenschaften haben, die gleich sind. Die Frage ist nur, wann haben die beiden genug gleiche Eigenschaften dieses zu vergleichen. Auch dieses Problem läst sich im Pattern definieren und die Suche dementsprechend durchführen. Bisher haben wir lediglich Dinge miteinander auf Gleichheit überprüft. Doch auch die Fragen: Ist ein Muster ein Bestandteil von einem oder mehrerer Objekte lässt sich mit Pattern Matching beantworten. Ob ein Apfel ein Teil einer Birne ist, erscheint keine sinnvolle Frage zu sein. Doch nehmen wir nur einen Kern des Apfels, kann diese Frage positiv beantwortet werden. Die letzte zu beantwortende Frage lautet: Hat ein Objekt eine gegebene Struktur? Auch ein Apfel hat eine Struktur, z.b. innen der Kern, dann das Fleisch und aussen die Schale. Auf diese Struktur können wir nun jeden anderen Apfel überprüfen. Dabei ist die Struktur unser Pattern das wir versuchen auf die anderen Äpfel zu Matchen. Natürlich waren all die gegebenen Beispiele extrem abstrakt und nicht wirklich für die Anwendung von Pattern Matching zu gebrauchen, doch sind die verschiedenen Aufgaben, die durch Pattern Matching gelöst werden können, klar geworden. Versuchen wir als Pattern Matching anhand dieser gewonnen Erkenntnisse zu definieren: Definition Pattern Matching: Pattern Matching ist der Vorgang, bei dem die Existenz eines gegebenen Musters (Pattern) überprüft oder die Qualität der Gleichheit zum gegebenen Muster bewertet wird

1.1 Die zwei Arten des Pattern Matching Anhand unserer Definition von Pattern Matching kann man schon erkennen, dass es zwei verschiedene Arten des Pattern Matching gibt, welche im folgenden Abschnitt vorgestellt werden. 1.1.1 Weiche Vergleiche Die weichen Vergleiche geben Informationen dazu aus, welche Qualität der Vergleich hatte. Sie decken also den zweiten Teil unserer Definition ab. Die wohl bekanntesten Anwendungen hierfür kommen aus der Kriminologie, DNA-Analyse und Vergleich von Fingerabrücken. Hierbei wird die am Tatort gefundene DNA bzw. der am Tatort gefundene Fingerabdruck mit einer Datenbank voll anderer DNA-Proben bzw. Fingerabrücken durch Pattern Matching verglichen und eine prozentuale Wahrscheinlichkeit für die Gleichheit zurückgegeben. 1.1.2 Harte Vergleiche Die für die Informatik wesentlich interessanteren Vergleiche gliedern sich in die Kategorie des harten Vergleichs ein. Sie geben eine exakte Aussage darüber, ob ein Vergleich erfolgreich war oder nicht. Sie decken den ersten Teil unserer Definition ab und gliedern sich noch einmal in zwei Untergruppen, wie sie in den Fragestellungen schon vorgekommen sind. Eine Untergruppe sind die harten Vergleiche, bei denen die genaue Äquivalenz des gegeben Muster mit anderen Objekten überprüft wird, wie z.b. der einfache Vergleich von zwei Strings. Die andere Untergruppe überprüft das Enthaltensein eines Musters in anderen Objekten, was in heutigen höheren Programmiersprachen zumeist als Pattern Matching bezeichnet wird. Der Spamfilter sucht z.b. im gesamten Text das Vorkommen bestimmter Wörter, die auf seiner Blacklist stehen. 2. Anwendungen in der Informatik Nachdem nun ein grober Überblick darüber verschaffen wurde, was Pattern Matching ist und welche Arten des Pattern Matching verwendet werden, wollen wir uns speziell die Anwendungen in der Informatik anschauen. Wir beginnen mit den Sequenzen, zu denen unter anderem Strings gehören, um an einfachen Algorithmen auf die späteren Komplikationen vorbereiten zu können. Doch zunächst eine kleine Einführung, welche Schritte für alle folgenden Anwendungen nötig sind. Das Pattern Matching besteht grundsätzlich aus zwei Schritten. Der erste Schritt besteht darin, das passende Muster für das angestrebte Ziel der Suche zu definieren, was sich bereits als schwere Aufgabe herausstellen kann. Der zweite Schritt ist die Findung und Durchführung eines Suchalgorithmus nach den gegebenen Mustern. 2.1 Sequenzen Die wohl berühmteste Vertretung der Gruppe der Sequenzen ist der String, von dem wir auch im Folgenden im Namen der Sequenz sprechen wollen. Für den ersten Schritt des Pattern Matchings, dem Finden des richtigen Musters, muss man sich zunächst das Ziel und den Zweck der Suche definieren, da die Muster für verschiedene Zwecke sehr verschiedene Muster aufweisen. 2.1.1 Äquivalenz Beginnen wir mit dem einfachsten Beispiel, der Ü- berprüfung der Gleichheit. Wollen wir genau wissen ob zwei Strings gleich sind, entspricht das Muster natürlich genau dem gesuchten String. Dieses Szenario ist wahrscheinlich das am häufigsten beim Programmieren verwendete, doch oftmals reicht es nicht aus. Der Algorithmus dazu ist auch kein großes Geheimnis. Man prüft von links nach rechts jeden einzelnen Buchstaben, erhält man einen Missmatch (Ungleichheit), sind die Strings nicht gleich. Eine einfache Darstellung für einen noch viel einfacheren Algorithmus ist ein endlicher Automat. Abbildung 1: Endliche Automat der "Hallo" erkennt Hierbei handelt es sich um einen deterministischen endlichen Automaten, der lediglich das Wort Hallo erkennt. Der Aufwand für einen deterministischen endlichen Automaten ist immer linear. Das ist in unserem Beispiel auch sehr gut daran zu sehen, dass jedes Zeichen maximal einmal überprüft werden muss. 2.1.2 Reguläre Ausdrücke Eine etwas komplexere Art der Suche ist das Finden von Strings, die eine bestimmte Struktur aufweisen. Ein Beispiel dafür ist z.b. eine Emailadresse. Diese sollte einer bestimmten Struktur entsprechen, beginnend mit einer beliebigen Anzahl von Zeichen, gefolgt von ei-

nem @-Zeichen, gefolgt von einer weitern beliebigen Anzahl von Zeichen, gefolgt von einem Punkt und einer abschließenden weitern beliebigen Anzahl von Zeichen. Zur Erfüllung dieser Aufgabe gibt es eine eigene Grammatik zur Definition von Mustern, die regulären ausdrücke (Regular Expressions). Das Muster zur Erkennung einer Emailadresse würde mit regulären Ausdrücken wie folgt aussehen: ^.+@.+\..+$. Auch reguläre Ausdrücke beschreiben eine Grammatik für einen endlichen Automaten. Abbildung 2: Endliche Automat für den regulären Ausdruck Auf den ersten Blick sollte dieser Automat exakt Emailadressen erkennen. Allerdings ist dieser Automat nicht deterministisch. Der Automat hat z.b. im Zustand S 1 keinen fest vorgeschriebenen Weg, sondern hat zwei mögliche Wege die er einschlagen kann. So könnte die Emailadresse karl@mustermann.de bereits im Zustand S 1 komplett durchlaufen werden, da das @-Zeichen ebenfalls ein beliebiges ist und in der Schleife abgehandelt werden kann. Dasselbe gilt für den Punkt. Um dieses Problem zu Lösen und den Aufwand zu bestimmen können wir uns Dank der Darstellung als endlichen Automaten auf eine alte Regel aus der theoretischen Informatik stützen: Zu jedem endlichen Automaten A lässt sich effektiv ein deterministischer Automat P(A) konstruieren, der dieselbe Sprache erkennt. Der Beweis zu diesem Theorem befindet sich im Skript zu Theoretische Informatik 1 von Prof. Dr. Hans Jörg Kreowski und wird daher an dieser Stelle nicht durchgeführt. Da dort zusätzlich noch bewiesen ist, dass die Transformation einer nicht-deterministischen in einen deterministischen Automaten in linearer Zeit möglich ist, können wir gleich eine Aussage über den Aufwand treffen. Der Vergleich eines Musters der Länge n mit einem Wort der Länge m liegt in der Aufwandsklasse O(n+m), da sowohl die Transformation als auch der Vergleich in linearer Zeit abgehandelt werden. Somit ist der Gesamtaufwand ebenfalls linear. 2.1.3 Exaktes Pattern Matching Beim exakten Pattern Matching untersucht man das Vorkommen eines fest vorgegebenen Musters, z.b. ein String, in einem anderen String. Ein Beispiel sieht wie folgt aus: String: a b b a b a b a c b a Im ersten Moment sieht das nicht nach einem schwierigeren Problem als die regulären Ausdrücke aus, allerdings erkennt man das Problem bei genauerer Betrachtung des oberen Beispiels. Ist das Pattern an der Position 2 zum Vergleich angekommen, so geht zunächst alles gut. Bis zum Vergleich an der Position 6, dort gibt es einen Missmatch. String: a b b a b a b a c b a Man kann nun nicht einfach bei Position 7 fortfahren, da der Match im vorherigen String anfangen könnte. Im Beispiel ist dies sogar der Fall, beginnt man an Position 4, so ist der Match erfolgreich. Daraus folgt, dass wir nur eine Position voranschreiten dürfen und wir Buchstaben aus dem String mehrfach vergleichen müssen. Dieses zurückgehen um sämtliche Möglichkeiten durchzuprobieren nennt man Backtracking. Beim Backtracking probiert man jede Möglichkeit bis die richtige gefunden wurde. Wenn man eine Möglichkeit ausprobiert, die auf dem Weg nicht funktioniert, springt man zurück zur Position der Wahl und probiert die nächste Möglichkeit. Solange bis man die richtige Lösung gefunden hat. Die Komplexität des Becktracking kann extrem hoch sein, wie z.b. in diesem einfachen Beispiel: String: a a a a a a a a a a a a a a a a a a a a Pattern: a a a a b In diesem Fall müssen wir 16 mal 5 Vergleiche durchführen, also insgesamt 160 Vergleiche die alle zu keinem Ergebnis führen. Ein Buchstabe des Strings wird bis zu 5mal für einen Vergleich hergezogen. Das ist natürlich alles andere als linear. Im schlechtesten Fall hat Backtracking einen exponentiellen Laufzeit, worauf im Kapitel über Graphen noch genauer eingehen werde. In unserem Fall liegt der schlechteste Fall bei O(mn) Vergleiche bei einem Pattern der Länge m und einem Wort der Läge n. Für das exakte Pattern Matching gibt es allerdings schon diverse Algorithmen mit einer wesentlich besseren Laufzeit haben können, wovon nun einer kurz vorgestellt werden soll.

Der Boyer-Moore-Algorithmus ist einer der bekanntesten und am häufigsten eingesetzten Algorithmus in Anwendungen wie z.b. der Suchfunktion in Texteditoren. Er hat als schlechtesten Fall ebenfalls eine Komplexität von O(mn) Vergleichen, doch ist im Schnitt wesentlich schneller. Die Grundidee liegt darin, das Muster von rechts nach links zu Überprüfen und somit die Möglichkeit zu erlangen es um mehr als nur eine Position shiften zu können. Im besten Fall ist bereits das erste verglichene Textsymbol ein Symbol, das im Muster überhaupt nicht vorkommt, dann kann das Pattern um die Länge des Musters verschoben werden, da das Muster in keiner anderen Position in dem dieser Buchstabe vorkommt einen Match erbringen kann. String: a b b a d a b a c b a b a b a c In diesem Fall kommt das d an Position 4 nicht im Muster vor, daher kann es an die Position 5 verschoben werden. Tritt immer dieser günstigste Fall beim Boyer- Moore-Algorithmus auf, so benötigt er O(n/m) Vergleiche. Diese Vorgehensweise wird auch als Schlechtestes Zeichen -Strategie beschrieben. Sie kann allerdings auch angewandt werden, wenn das gefundene Zeichen zwar zu einem Missmatch führt, aber an einer Stelle im Muster vorkommt. Dann kann das Muster allerdings nur so weit geshiftet werden, bis das Vorkommen auf das Zeichen ausgerichtet ist. String: a b b a b a b a c b a b a b a c Allerdings ist die Schlechtestes Zeichen -Strategie nicht immer die beste, im folgenden Beispiel würde sie z.b. ein negatives Shiften zur Folge haben. 3. Bäume Nachdem die Sequenzen soweit abgehandelt sind und durch relativ simple Algorithmen wie endliche Automaten oder den Boyer-Moore-Algorithmus zu lösen sind, gehen wir einen Schritt weiter und untersuchen das Pattern Matching auf Bäume. Dabei gehen wir wieder in derselben Reihenfolge der zwei nötigen Schritte vor. Zunächst definieren wir die zu suchenden Muster. Wie bei den Sequenzen gibt es hier den sehr trivialen Fall des exakten Vergleiches zweier Bäume. In diesem Fall entspricht das Muster dem zu suchenden Baum. Wir traversieren den Baum, auf die Methoden später eingegangen wird, und brechen ab sobald entweder ein Missmatch auftritt oder der Baum vollständig durchlaufen wurde. Es kann auf jeden Fall gesagt werden, dass dieses Problem mit linearem Aufwand gelöst werden kann, da jeder Knoten des Baumes nur einmal besucht werden muss, egal wie er traversiert wird. Auch bei den Bäumen wird es wieder schwer, wenn wir einen Teilbaum innerhalb eines anderen Baumes suchen wollen. Abbildung 3: Baum String: a b a a b a b a c b a Pattern: c a b a b c a b a b c a b a b (Schlecht) (Gut) Um das gute Ergebnis zu erreichen gibt es die Gutes Ende -Strategie. Man probiert ob das Suffix, welches übereingestimmt hat an anderer Stelle im Muster vorkommt und richtet diese aus. Abbildung 4: Muster Zunächst wollen wir uns einmal mit den beiden bekanntesten Algorithmen zum durchlaufen eines Baumes

beschäftigen. Zum einen gibt es die Tiefensuche, welche rekursiv die Kindknoten eines Knotens von links nach rechts traversiert. Da nun die verschiedenen Algorithmen zum Durchlaufen eines Baumes bekannt sind, können wir bestimmen, dass der Aufwand zum Finden eines einzelnen Knotens linearen Aufwand hat. Doch sobald das Muster, das wir finden wollen, aus mehr als einem Knoten besteht, kommt das Backtracking wieder ins Spiel. Das oben aufgeführte Beispiel ist wieder ein Beispiel an dem eine Menge Zeit und Aufwand verbraten wird, ohne etwas zu finden. Sobald wir unseren Wurzelknoten des Musters im Baum gefunden haben, müssen wir von diesem ausgehend die anderen Knoten des Musters mit den ausgehenden Knoten vom gefundenen Knoten im Baum vergleichen. Stoßen wir im Verlauf des Vergleiches auf einen Missmatch, gehen wir im schlechtesten Fall zum Ausgangsknoten zurück und probieren ie anderen möglichen Pfad aus. In unserem Fall ist dies nicht der Fall, hier muss von dem Knoten, bevor der Missmatch aufgetreten ist, jeder andere Kindknoten überprüft werden. 4. Graphen Abbildung 5: Tiefensuche Die zweite Variante ist die Breitensuche, bei der die Kindknoten eines Knotens zunächst von links nach rechts durchlaufen werden, ist das Ziel noch nicht erreicht, werden alle Kindknoten der bereits besuchten Knoten von links nach rechts durchlaufen. 1 B 3 A 2 C D E F G 4 5 6 Abbildung 6: Breitensuche Die letzte Form des Pattern Matchings, die in diesem Dokument betrachtet wird, ist das Pattern Matching auf Graphen. Das finden von Mustern in Graphen ist der erste und wahrscheinlich auch schwierigste Teil der Graphtransformation. Der folgende Text wird sich auch den Hintergrund der Graphtransformation als Hauptthema nehmen. Grundsätzlich unterscheidet man drei verschiedene Arten von Algorithmen für Pattern Matching auf Graphen, welche sich wiederum in einzelne Unterformen aufgliedern. Dabei handelt es sich um die Algorithmen die einen Graphen exakte Übereinstimmung der Graphen voraussetzen, um die Algorithmen die nicht exakte Übereinstimmungen aufspüren sowie die Algorithmen, die sich mit den weiteren Übereinstimmungsproblemen auseinander setzen. Für die Graphtransformation sind die exakten Algorithmen interessant, daher werden wir dieses genauer betrachten. Diese unterteilen sich noch mal in sehr strenge und abgeschwächte Formen der Übereinstimmung. Die strengste Form des exakten Matching verlangt nach Graph-Isomorphismus. Das bedeutet, das jeder Knoten und jede Kante des Musters auf genau einen Knoten bzw. eine Kante im anderen Graphen abgebildet werden kann und das keine anderen Knoten oder Kanten existieren Kurz gesagt, die Äquivalenz zweier Graphen. Abbildung 7: Graph-Isomorphismus

Die zweite, eine etwas abgeschwächte Form des exakten Matchings, verlangt nach Subgraph- Isomorphismus. Das hei0t, es muss Graph- Isomorphismus zwischen dem Muster und einem Teilgraphen des anderen Graphen bestehen. Abbildung 8: Subgraph-Isomorphismus Die dritte und abgeschwächteste Form verlangt einen Homomorphismus zwischen den beiden Graphen. Beim Homomorphismus ist es zusätzlich zu den Eigenschaften des Subgraph-Isomorphismus erlaubt, mehrere Knoten des einen Graphen auf einen Knoten eines Subgraphen des anderen Graphen abzubilden. oder Breitensuche auf Graphen angewandt werden. Dabei wird überprüft, ob die durch die bisher gefundenen Knoten und Abbildungen gefundenen Graphen isomorph sind. Sollte das nicht der Fall sein, geht der Algorithmus im Suchbaum zurück zu der Stelle, an der er die letzte Abbildung eingefügt hat und überprüft die Alternativen zu dieser fehlgeschlagenen Entscheidung. Um von vorn herein möglichst viele Fehlentscheidungen auszuschließen, überprüft der Algorithmus zusätzlich, ob es von den Nachbarknoten des Knoten der als potenziellen Abbildung gefunden wurde, bereits mindestens eine Abbildung gefunden wurde. Dieser Algorithmus hat im besten Fall eine Komplexität von O(mn), wobei m die Anzahl der Knoten im ersten und n die Anzahl der Knoten im zweiten Graphen ist. Im schlechtesten Fall schneidet der Algorithmus allerdings mit einer Laufzeit von O(m n n²) ab. Eine andere Möglichkeit Pattern Matching auf Graphen auszuführen ist es, das gesuchte Muster in einen Entscheidungsbaum zu transformieren, wobei entweder ein Knotenpaar, oder eine Kante zwischen zwei Knoten als eine Entscheidung angesehen werden. Abbildung 10: Muster A->B Abbildung 9:Homomorphismus Ein Algorithmus, der sich schon früh mit allen drei beschriebenen Problemen befasst hat, war der Algorithmus von Ullmann. Dieser benutzt das Prinzip des Backtracking. Für jeden Knoten aus dem Graphen A wird sukzessiv überprüft, welche Knoten vom Graphen B als Abbildung in Frage kommen. Dazu müssen mindestens die Markierungen und der Grad der Knoten identisch sein. Dabei können die Verfahren der Tiefen- B->D B->C D->C C->D Abbildung 11: Entscheidungsbaum

Wir unterteilen das gesamte Problem einen Graphen in einem anderen Graphen zu finden in mehrere Teilprobleme. Wir beginnen die Suche nach der Kante in der Wurzel des Entscheidungsbaumes. Haben wir diese gefunden, sucht man von dort ausgehend eine Abbildung für die nächste Kante. Dabei benutzt man ebenfalls das Prinzip des Backtracking. Man probiert solange alle Möglichkeiten vom ersten gefundenen Problem aus, bis man entweder eine entsprechende Kante gefunden hat oder es keine weiteren Kanten mehr gibt. An dieser Stelle möchte ich zum Abschluss noch die Situation vorstellen, wo der Backtracking Algorithmus zu einem exponentiellen Aufwand führen kann. Es wird angenommen, es müsste eine Tiefensuche durchgeführt werden. Bei dieser gehen maximal k mögliche Verzweigungen von jeder Teillösung aus. [4] H.W. Lang, FH Flensburg, Boyer-Moore-Algorithmus, Fassung vom 11.1.2005, URL: http://www.iti.fhflensburg.de/lang/algorithmen/pattern/bm.htm, Zugriff am 13.11.2005 [5] G. Valentine, C. Martínez, An algorithm for graph pattern-matching, Fassung vom???, URL: http://www.cs.dartmouth.edu/~brd/teaching/bio/current/2pa pers/algorithms/valiente-graph-matching-wsp97.pdf, Zugriff am 10.11.2005 [6] C. Charras, T. Lecroq, Exact String Matching Algorithms, Fassung vom 14.01.1997, URL: http://www.cs.dartmouth.edu/~brd/teaching/bio/current/2pa pers/algorithms/valiente-graph-matching-wsp97.pdf, Zugriff am 23.11.2005 Abbildung 12: Beispiel k=2, n=4 Aus dem Beispiel ergibt sich der Aufwand bei einem Lösungsbaum der Tiefe n im schlechtesten Fall von: n+ 1 n ( k 1) 1+ k + k² + k³ +... + k = = O( k ( k 1) 4. Referenzen [1] A.B. Smith, C.D. Jones, and E.F. Roberts, Article Title, Journal, Publisher, Location, Date, pp. 1-10. [1] Hans-Jörg Kreowski, Universität Bremen, Theoretische Informatik 1, Fassung von Oktober 2005, URL: http://www.informatik.unibremen.de/theorie/teach/lehre/thi1/ws0506/skript/main.pdf, Zugriff am 28.10.2005 [2] Jan Omland, Applications of Graph Matching in Pattern Recognition, Dassund vom 13.06.2005, URL: http://arachne.unimuenster.de:8018/groupjiang/teaching/ss05/seminarss05/do wnloads/gminpr.pdf, Zugriff am 16.11.2005 [3] Wikipedia, Verschiedene Themen, URL: http://www.wikipedia.org, Zugriff am: 13.11.2005 n )