Approximative Suche in Baumstrukturen

Werbung
G OTTFRIED W ILHELM L EIBNIZ U NIVERSITÄT H ANNOVER
FAKULTÄT FÜR E LEKTROTECHNIK UND I NFORMATIK
I NSTITUT FÜR P RAKTISCHE I NFORMATIK
FACHGEBIET P ROGRAMMIERSPRACHEN UND Ü BERSETZER
Masterarbeit
Approximative Suche
in Baumstrukturen
Gennadi Mirmov
Matrikelnummer: 2242560
November 2009
Erstprüfer: Prof. Dr. R. Parchmann
Zweitprüfer: Prof. Dr. H. Vollmer
Gesetzt mit
LATEX 2ε
3
Inhaltsverzeichnis
Inhaltsverzeichnis
Inhaltsverzeichnis
3
1
Einleitung
5
2
Grundlagen und Definitionen
9
3
2.1 Grundlegende Schreibweisen und Grundlagen . . . . . . . . . . . . . . .
2.2 Edit-Operationen auf Bäumen . . . . . . . . . . . . . . . . . . . . . . . .
9
12
Vergleich von Bäumen über Edit-Operationen
17
3.1 Baum-Edit-Distanz . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Edit-Distanz-Abbildungen . . . . . . . . . . . . . .
3.1.2 Rekursionsformel zur Berechnung der Edit-Distanz
3.2 Baum-Alignment-Distanz . . . . . . . . . . . . . . . . . . .
3.3 Baum-Inklusion-Problem . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
17
17
21
23
26
Verfahren zur Berechnung der Baum-Edit-Distanz
29
4.1 Zhang-Shasha-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Klein-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
37
5
Verfahren zur Berechnung der Baum-Alignment-Distanz
41
6
Approximative Baumsuche
47
6.1 Das approximative Baum-Matching-Problem . . . . . . . . . . . . . . . .
6.2 Approximative Baumsuche nach Jansson und Peng . . . . . . . . . . . .
47
56
7
Implementierung
65
8
Fazit und Ausblick
69
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Literaturverzeichnis
71
Abbildungsverzeichnis
73
Algorithmenverzeichnis
75
Kapitel 1. Einleitung
5
1 Einleitung
Verarbeitung von Zeichenketten ist ein wichtiges Teilgebiet der Informatik, und tritt
in vielen Bereichen, wie z.B. der Dokumentenverarbeitung oder Genomforschung, auf.
Eine Wissenschaft die sich mit Textalgorithmen [CR94] beschäftigt nennt man auf englisch auch Stringology. Beruhend auf Stringology entwickelte sich eine Wissenschaft namens Treeology, die Stringology durch mehrdimensionale Strukturen erweitert und sich
statt Zeichenketten mit Bäumen befasst. Im Gegensatz zu Zeichenketten ist ein Baum
ein spezieller Graph und stellt eine mehrdimensionale Struktur dar, mit der sich eine
Monohierarchie modellieren lässt. Bäume gelten als die wichtigsten nicht linearen Datenstrukturen, die im Bereich der Computeralgorithmen eingesetzt werden [Knu69]. So
können viele Vorgänge und Strukturen, die bestimmte Informationen mit sich führen,
in unterschiedlichsten Anwendungsgebieten grafisch und übersichtlich durch Bäume
repräsentiert werden. In der Molekularbiologie wird eine RNA (Ribonukleinsäure), die
ähnlich einer DNA neben Phosphorsäure und Pentose aus den vier Nukleobasen Adenin
(A), Guanin (G), Cytosin (C) sowie Uracil (U) aufgebaut ist und genetische Informationen überträgt, durch eine Zeichenkette über vier Buchstaben A, G, C und U dargestellt.
Dabei lässt sich eine RNA in eine Sekundärstruktur zerlegen, die aus den stabilen Basenpaaren C-G, A-U und schwachen Paaren U-G besteht. Eine RNA-Sekundärstruktur gibt
einen genauen Einblick in die tatsächliche Molekülstruktur der vorliegenden RNA und
kann bequem durch einen Baum repräsentiert werden, dessen Knoten mit bestimmten
Symbolen beschriftet sind (siehe Abbildung 1.1). Da die Knoten eines solchen Baumes beschriftet sind, heißt er ein beschrifteter Baum. Zudem besitzt ein beschrifteter
Baum auch die Eigenschaft, dass bei ihm ein Knoten als Wurzel ausgezeichnet ist. Beschriftete Bäume spielen eine große Rolle in der Informatik als Datenstrukturen für die
Repräsentation hierarchischer Daten. Ein Beispiel dafür liefern die XML-Dokumente,
die in ihrem Aufbau den beschrifteten Bäumen entsprechen [CAM02]. Weiterhin kommen beschriftete Bäume in strukturierten Textdatenbanken vor. Dabei repräsentieren
sie die Struktur der gespeicherten Dokumente und ermöglichen eine effiziente Suche
nach bestimmten Textstellen in ihnen. Auch in vielen anderen Bereichen wie Bildanalyse (Darstellung von 3D-Objekten), Chemie (Molekülgraphen), Compileroptimierung
(Parse- bzw. Ableitungsbäume) oder Genetik (Stammbäume) kommen Bäume ständig
zum Einsatz [JWZ95]. Eines der wichtigsten und oft auftauchenden Probleme in allen
oben genannten Bereichen, besteht im Vergleich von Bäumen. Die modellierten Baumstrukturen müssen oftmals miteinander verglichen und auf Ähnlichkeit überprüft werden, um Aussagen über ihre Beschaffenheit folgern oder bestimmte Strukturen identifizieren zu können. Zum Beispiel können unterschiedliche RNA-Molekülketten ähnliche
Sekundärstrukturen erzeugen [ZS89]. Aus diesem Grund ist es notwendig in der Molekularbiologie RNA-Sekundärstrukturen miteinander zu vergleichen, um Ähnlichkeiten
bezüglich der Funktionalität verschiedener RNAs ausmachen zu können.
6
Approximative Suche in Baumstrukturen
Abbildung 1.1: (a) RNA-Primärstruktur.
(b) RNA-Sekundärstruktur.
(c) Baumrepräsentation der RNA-Sekundärstruktur.
In dieser Arbeit beschäftige ich mich mit den Problemen, die beim Vergleich von beschrifteten Bäumen auftreten. Ein Ziel dabei war es, einen allgemeinen Überblick über
die existierenden Probleme dieser Art in einem einheitlichen und gemeinsamen Rahmen
zu verschaffen. Wie bei Zeichenketten kann die Ähnlichkeit zwischen zwei beschrifteten
Bäumen T1 und T2 über die minimalen Kosten gemessen werden, die notwendig sind,
um den Baum T1 in T2 mit Hilfe von elementaren Edit-Operationen zu transformieren.
Dabei wirken die Edit-Operationen auf einzelne Knoten der Bäume bzw. deren Beschriftungen. Es werden drei elementare Edit-Operationen auf Knoten von Bäumen betrachtet: Umbeschriftung, Löschung und Einfügung von Knoten. Jeder elementaren Operation werden dann, abhängig vom gelöschten, eingesetzten oder bei einer Umbeschriftung
geänderten Symbol eines Knotens, Kosten zugeordnet. Hierbei existieren mehrere Möglichkeiten mit Hilfe von Edit-Operationen die Ähnlichkeit zwischen zwei Bäumen zu
messen. Im Allgemeinen führt der Vergleich von Bäumen über die Edit-Operationen auf
drei zentrale Probleme: die Baum-Edit-Distanz, Baum-Alignment-Distanz und das BaumInklusion-Problem. Alle diese Probleme werden in dieser Arbeit detailliert präsentiert.
Für die Baum-Edit- und Baum-Alignment-Distanz werden die grundlegenden Algorithmen vorgestellt und genau beschrieben. Dabei wird für alle Algorithmen die Zeit- und
Speicherkomlexität analysiert und am Ende die Korrektheit des Algorithmus bewiesen.
Schließlich wird der Übergang von dem Edit-Distanz-Problem auf das sogenannte approximative Baum-Matching-Problem besprochen, wobei hier die Beziehungen zwischen
diesen beiden Problemen in einem gemeinsamen Rahmen ausführlich diskutiert und
hinterher die dazugehörigen Algorithmen beschrieben werden. Beim Baum-MatchingProblem geht es nicht nur darum, die Ähnlichkeit zwischen zwei ganzen Bäumen T1 und
Kapitel 1. Einleitung
7
T2 zu messen, sondern auch darum bestimmte Teilstrukturen von T1 , die durch das Entfernen oder Abschneiden von Knoten aus T1 entstehen können, mit T2 zu vergleichen. In
Abschnitt 6.2 wird außerdem gezeigt wie die Lösung dieses Problems zum Finden von
vorgegebenen Teilstrukturen in einem Baum benutzt werden kann, die zu einem anderen gegebenen Baum, dem sogenannten Pattern-Baum, die größte Ähnlichkeit aufweisen. Ferner werden alle in dieser Arbeit vorgestellten Algorithmen zum Experimentieren
in einem grafischen Java-Tool implementiert, das in Kapitel 7 beschrieben wird.
Kapitel 2. Grundlagen und Definitionen
9
2 Grundlagen und Definitionen
2.1 Grundlegende Schreibweisen und Grundlagen
In diesem Kapitel werden Begriffe erklärt und definiert, die für das Verständnis dieser
Arbeit notwendig sind.
Ein Graph ist ein 2-Tupel G = (V, E), wobei V eine Knotenmenge und E ⊆ {(v, w) | v, w ∈ V }
eine Kantenmenge bezeichnet. Für einen Graph G ist V (G) die Menge der Knoten von
G und E(G) die Menge der Kanten von G. Graphen, deren Kanten eine ausgezeichnete
Richtung aufweisen, sind gerichtet, andernfalls heißen sie ungerichtet. Ein Pfad eines
Graphen G ist eine Folge von Knoten aus V (G), in welcher aufeinander folgende Knoten
durch Kanten verbunden sind und sich kein Knoten wiederholt. Ein Zyklus ist ein Pfad
mit identischen Anfangs- und Endknoten.
Ein Baum ist im Allgemeinen ein ungerichteter, verbundener und zyklenfreier Graph,
d.h, in dem zwischen je zwei beliebigen Knoten genau ein Pfad existiert. Dagegen stellt
ein gewurzelter Baum (engl. rooted tree) einen gerichteten, verbundenen und zyklenfreien Graph dar, bei dem ein bestimmter Knoten als Wurzel ausgezeichnet ist. Gewurzelte
Bäume lassen sich in Out-Trees, bei denen die Kanten von der Wurzel ausgehen, und in
In-Trees, bei denen die Kanten in Richtung Wurzel zeigen, unterscheiden. Alle weiteren
in dieser Arbeit vorkommenden Bäume werden als Out-Trees betrachtet. Die Wurzel eines gewurzelten Baumes T wird als root(T ) bezeichnet. Ferner besitzen die Knoten von
T unterschiedliche Beziehungen untereinander, die im Folgenden erklärt werden. Ein
Knoten v ∈ V (T ) heißt Vorgänger eines Knotens w ∈ V (T ) und umgekehrt w ein Nachfolger von v, wenn es einen Pfad von v nach w gibt. Gilt zusätzlich v 6= w, wobei v auf
einem Pfad von der Wurzel bis zu einem Blatt vor w liegt, dann ist v ein echter Vorgänger
von w und w ein echter Nachfolger von v. Mit anc(v) wird die Menge aller Vorgänger
eines Knotens v ∈ V (T ) angegeben. Sind v und w direkt durch eine Kante verbunden, so
heißt v der Vater von w und w ein Kind von v, falls v der direkte Vorgänger von w, d.h.
(v, w) ∈ E(T ) ist. Für jeden Knoten v ∈ V (T ) bezeichnet p(v) den Vater von v und pk (v)
den k-ten Vorgänger von v mit p0 (v) = v. Zwei Knoten v, w ∈ V (T ) heißen Geschwister,
falls sie denselben Vater haben, d.h. wenn p(v) = p(w) gilt. Ein Knoten, der keine Kinder
bzw. keine echten Nachfolger besitzt, heißt Blatt. Die Menge der Blätter von T wird mit
L(T ) bezeichnet.
Weiterhin unterscheidet man zwischen geordneten und ungeordneten Bäumen. Ein geordneter Baum ist ein Baum, in welchem die Reihenfolge der Kinder eines jeden Knotens von links nach rechts festgelegt ist. Hat ein Knoten v eines geordneten Baumes
die Kinder v1 , v2 , . . . , vi , wobei v1 das linkeste und vi das rechteste Kind in der Folge ist,
10
Approximative Suche in Baumstrukturen
so bezeichnet v1 den ersten Kind von v, v2 den zweiten Kind von v, usw. bis zum i-ten
Kind von v. Ist die Reihenfolge der Kinder von Knoten eines Baumes nicht vorgegeben,
so spricht man von einem ungeordneten Baum. Ein geordneter Wald ist eine Folge von
geordneten Bäumen T1 , . . . , Tk , bei dem die Bäume T1 , . . . , Tk von links nach rechts geordnet sind. Entsprechend bezeichnet ein ungeordneter Wald eine Menge von ungeordneten
Bäumen. Wenn nachfolgend in dieser Arbeit von Baumstrukturen gesprochen wird, dann
können sowohl Bäume als auch Wälder gemeint sein.
Bezeichne im Folgenden θ einen leeren Baum, der keine Knoten enthält und T (v) einen
Teilbaum eines gewurzelten Baumes T , der aus der Wurzel v ∈ V (T ) und allen Nachfolgern von v besteht. Ein Teilwald von T setzt sich aus den Teilbäumen T (v1 ), . . . , T (vk )
zusammen, deren Wurzeln v1 , . . . , vk Geschwister in T sind. Ist v der Vater von diesen Geschwistern, so wird dieser Teilwald mit F(v) bezeichnet. Teilwälder T (v) mit v 6= root(T )
heißen echte Teilwälder von T .
Um auf einzelne Knoten v eines Baumes T verweisen zu können, werden sie mit einer
positiven ganzen Zahl 1 ≤ v ≤ |T |, assoziiert und nach einer bestimmten Ordnung nummeriert, wobei |T | die Anzahl der Knoten in T angibt. Dabei gibt es verschiedene Möglichkeiten die Knoten v zu nummerieren, indem man sie in einer bestimmten Reihenfolge durchläuft. Durchlaufen der Knoten eines Baumes in einer bestimmten Reihenfolge
bezeichnet man als Traversierung. Oft werden die Knoten durch das Traversieren eines Baumes in einer Prä- oder Postordnung nummeriert. Die Präordnung-Traversierung
eines geordneten Baumes T mit der Wurzel v, deren Kinder v1 , . . . vi sind, ergibt sich,
indem man zuerst die Wurzel v besucht und dann rekursiv alle Teilbäume T (vk ) für
1 ≤ k ≤ i von links nach rechts in Präordnung durchläuft. Ähnlich wird der Baum T in
Postordnung traversiert, indem zuerst alle Teilbäume T (vk ) für 1 ≤ k ≤ i rekursiv von
links nach rechts durchlaufen werden und anschließend die Wurzel v besucht wird. Um
sich auch auf bestimmte Knoten eines ungeordneten Baumes beziehen zu können, werden sie in einer beliebigen Reihenfolge fixiert und dann entsprechend der Prä- oder
Postordnung-Traversierung nummeriert. Im weiteren Verlauf dieser Arbeit werden alle
vorkommenden Bäume anhand der Postordnung nummeriert sein, wenn nichts anderes angegeben ist. Jetzt kann durch die Prä- und Postordnung formal definiert werden,
wann ein Knoten v links von einem anderen Knoten w in einem Baum liegt.
Definition 2.1
Sei T ein gewurzelter geordneter Baum und v, w ∈ V (T ). Bezeichne pre(v) die Anzahl der
Knoten, die beim Traversieren von T in Präordnung vor v besucht werden und post(v) ihre
Anzahl analog in Postordnung. Knoten v liegen links von w in T , falls für sie folgende
Bedingung erfüllt ist:
pre(v) < pre(w) und post(v) < post(w).
Liegt v links von w, so befindet sich w rechts von v.
Häufig werden die Knoten eines Baumes T mit Symbolen beschriftet, um sie mit gewissen Informationen auszustatten. Für das Folgende sei Σ ein endliches Alphabet, − ∈
/Σ
e
ein Blank-Symbol und Σ = Σ ∪ − das aus dem Σ und dem Blank-Symbol zusammengesetzte Alphabet. Dann ist ein beschrifteter Baum (engl. labeled tree) über dem Alphabet
Σ ein gewurzelter Baum, bei dem jeder Knoten mit einem Symbol aus Σ beschriftet ist.
Kapitel 2. Grundlagen und Definitionen
11
Ein beschrifteter Wald ist eine Menge von beschrifteten Bäumen. An einigen Stellen in
dieser Arbeit werden Bäume über dem Alphabet Σ mit TΣ bezeichnet. Wenn nicht anders angegeben, werden alle folgenden in dieser Arbeit betrachteten Bäume gewurzelt,
geordnet und über dem Alphabet Σ beschriftet sein, ohne dass es explizit erwähnt wird.
Für jeden Knoten v ∈ V (T ) bezeichnet T [v] die Beschriftung von v. Eine Baumstruktur
bestehend aus allen Knoten u ∈ V (T ) mit v ≤ u ≤ w, für v, w ∈ V (T ), wird als T [v..w]
angegeben. Ist v > w, so ist T [v..w] = θ der leere Baum. Außerdem heißt T [1..w] für
0 ≤ w ≤ |T | ein Präfix von T und T [v..|T |] für 1 ≤ v ≤ |T | + 1 ein Suffix von T , wobei hier
die Knoten von T entsprechend ihrer Postordnung-Traversierung von links nach rechts
nummeriert sind. Weiterhin definiere l(v) für alle v ∈ V (T ), als den Knoten mit der
kleinsten Nummerierung in dem Teilbaum T (v). Bei einer Postordnung der Knoten liefert l(v) stets das linkeste Blatt im Teilbaum T (v). Außerdem gilt dabei T (v) = T [l(v)..v]
sowie F(v) = T [l(v)..v − 1].
Zwei weitere Begriffe, die oft in Zusammenhang mit Bäumen verwendet werden, sind
der Grad und die Tiefe eines Knotens. Der Grad eines Knotens v ∈ V (T ) ist die Anzahl
seiner Kinder und wird mit deg(v) bezeichnet. Die Tiefe eines Knotens v ∈ V (T ) ist die
Anzahl der Kanten auf dem Pfad von root(T ) nach v und wird mit depth(v) bezeichnet.
Beide Begriffe lassen sich auch auf Bäume erweitern. Dann wird der Grad eines Baumes
T als deg(T ) = maxv∈V (T ) {deg(v)} und die Tiefe von T als depth(T ) = maxv∈V (T ) {depth(v)}
definiert.
Die Tabelle 2.1 fasst noch einmal in einer kurzen Übersicht die in dieser Arbeit verwendeten Notationen.
12
Notation
θ
root(T )
|T |
V (T )
E(T )
L(T )
|L(T )|
T [v..w]
T [1..w]
T [v..|T |]
T [v]
T (v)
F(v)
l(v)
p(v)
pk (v)
deg(v)
depth(v)
deg(T )
depth(T )
anc(v)
Approximative Suche in Baumstrukturen
Definition
Der leere Baum bzw. Wald.
Die Wurzel von T .
Die Anzahl der Knoten in T .
Die Menge der Knoten von T .
Die Menge der Kanten von T .
Die Menge der Blätter von T .
Die Anzahl der Blätter in T .
Eine Baumstruktur von T bestehend aus allen Knoten u ∈ V (T ) mit
v ≤ u ≤ w.
Ein Präfix von T mit 0 ≤ w ≤ |T |.
Ein Suffix von T mit 1 ≤ v ≤ |T | + 1.
Die Beschriftung von v.
Ein Teilbaum von T bestehend aus der Wurzel v und allen Nachfolgern
von v. Bei einer Postordnung gilt: T (v) = T [l(v)..v].
Ein Teilwald von T bestehend aus den Teilbäumen von T , deren Wurzeln
Geschwister sind. Bei einer Postordnung gilt: F(v) = T [l(v)..v − 1].
Liefert den Knoten mit der kleinsten Nummerierung im Teilbaum T (v).
Der Vater von v.
Der k-te Vorgänger von v: p0 (v) = v, p1 (v) = p(v), p2 (v) = p(p(v)) usw.
Der Grad von v. Ist die Anzahl der Kinder von v.
Die Tiefe von v. Ist die Anzahl der Kanten auf dem Pfad von root(T )
nach v.
Der Grad von T : deg(T ) = maxv∈V (T ) {deg(v)}.
Die Tiefe von T : depth(T ) = maxv∈V (T ) {depth(v)}.
Die Menge der Vorgänger von v: {pk (v) | 0 ≤ k ≤ depth(v)}.
Tabelle 2.1: Notationen für einen Baum T mit v, w ∈ V (T ).
2.2 Edit-Operationen auf Bäumen
Im eindimensionalen Fall wird eine Zeichenkette mit Hilfe von elementaren EditOperationen in eine andere transformiert. Die elementaren Edit-Operationen wirken
dabei jeweils auf ein Zeichen der Zeichenkette. Basierend auf drei elementaren EditOperationen, Substitution eines Zeichens durch ein anderes, Löschung eines Zeichens,
Einfügung eines Zeichens, stellten Wagner und Fischer [WF74] die Ähnlichkeit von zwei
Zeichenketten fest. Um mit Bäumen analog arbeiten zu können, führte Tai [Tai79] erstmals drei Edit-Operationen ein, die jeweils auf einzelne Knoten bzw. deren Beschriftungen angesetzt werden. Sei T ein geordneter beschrifteter Baum über dem Alphabet Σ.
Dann werden die Edit-Operationen auf T wie folgt definiert:
Definition 2.2 (Edit-Operationen)
Umbeschriftung eines Knotens v in T : Ersetze das Symbol des Knotens v durch ein anderes
Symbol aus Σ.
Löschung eines Knotens v in T : Für einen Nicht-Wurzelknoten v mit dem Vater v0 verschie-
Kapitel 2. Grundlagen und Definitionen
13
be die Kanten zwischen v und seinen Kindern (falls vorhanden) so, dass die Kinder
von v nach der Verschiebung die Kinder von v0 werden und die festgelegte Reihenfolge der Kinder erhalten bleibt. Anschließend entferne den Knoten v und die Kante (v0 , v) ∈ E(T ). Für einen Wurzelknoten v entferne v und alle Kanten (v, w) mit
p(w) = v.
Einfügung eines Knotens v in T : Das Komplement von Löschen. Füge den Knoten v als Kind
von v0 ein und verschiebe die Kanten zwischen v0 und einer Teilfolge seiner Kinder (falls
vorhanden) so, dass die Kinder dieser Teilfolge nach der Verschiebung die Kinder von
v werden und die festgelegte Reihenfolge der Kinder erhalten bleibt.
Abbildung 2.1 veranschaulicht die drei Edit-Operationen. Für einen ungeordneten beschrifteten Baum können die Edit-Operationen ähnlich definiert werden. Dabei arbeiten
die Operationen Löschung und Einfügung mit Teilmengen von Knoten und nicht mit Teilfolgen, so dass in diesem Fall die Reihenfolge der Kinder eines Knotens unwesentlich ist.
Seien T1 und T2 beschriftete Bäume. In Anlehnung an [WF74] und [Tai79] wird eine
e × Σ)\(−,
e
Edit-Operation als ein Paar (a, b) ∈ (Σ
−) repräsentiert. Hierbei bezeichnet a
entweder ein Symbol eines Knotens v ∈ V (T1 ) oder das Blank-Symbol „−“. Analog bezeichnet b entweder ein Symbol eines Knotens w ∈ V (T2 ) oder das Blank-Symbol „−“.
Man schreibt auch a → b für das Paar (a, b)1 . Damit kann eine Edit-Operation durch
folgende drei Möglichkeiten gemäß der Definition 2.2 angegeben werden:
(1) Ist a 6= − und b 6= −, dann repräsentiert das Paar (a, b) die Umbeschriftung eines
Knotens v ∈ T1 mit dem Symbol a durch das Symbol b.
(2) Ist a 6= − und b = −, dann repräsentiert das Paar (a, b) die Löschung eines Knotens
v mit dem Symbol a in T1 .
(3) Ist a = − und b 6= −, dann repräsentiert das Paar (a, b) die Einfügung eines Knotens
w mit dem Symbol b in T1 .
Geht der Baum T1 durch Anwendung einer Edit-Operation a → b in den Baum T2 über,
(a,b)
so schreibt man T1 ==⇒ T2 .
Definition 2.3 (Baum-Transformation)
Sei S eine Folge s1 , . . . , sk von Edit-Operationen. S transformiert T1 in T2 , wenn es eine Folge
s
von Bäumen A0 , . . . , Ak gibt, so dass T1 = A0 , T2 = Ak und Ai−1 ⇒
=i Ai für 1 ≤ i ≤ k.
Die Abbildung 2.2 zeigt ein Beispiel einer Baum-Transformation.
Um verschiedene Edit-Operationen unterschiedlich zu gewichten, wird eine Kostenfunke × Σ)
e → R definiert. Jeder Edit-Operation a → b werden dann abhängig von
tion γ : (Σ
den in ihr auftretenden Symbolen a, b Kosten zugeordnet. Die Kostenfunktion bildet ein
paar von Symbolen auf eine nichtnegative reelle Zahl ab und stellt stets eine Distanze gilt:
Metrik dar. D.h. für alle a, b, c ∈ Σ
1 Da
mehrere Knoten mit demselben Symbol beschriftet sein können, ist diese Schreibweise mehrdeutig.
Nichtsdestotrotz wird im Folgenden aus dem Kontext immer klar sein, welcher Knoten gemeint ist.
14
Approximative Suche in Baumstrukturen
T1
T2
a
b
(a) Umbeschriftung eines Knotens mit
dem Symbol a durch das Symbol b.
T1
T2
a
a
F
b
F
(b) Löschung eines Knotens mit dem
Symbol b. F bezeichnet den Wald bestehend aus Bäumen, deren Wurzeln
die Kinder des Knotens mit dem Symbol b sind.
T1
T2
a
a
F
b
F
(c) Einfügung eines Knotens mit dem
Symbol b. F bezeichnet den Wald bestehend aus Bäumen, deren Wurzeln
die Knoten einer Teilfolge von Kindern des Knotens mit dem Symbol a
sind.
Abbildung 2.1: Edit-Operationen auf Bäumen.
15
Kapitel 2. Grundlagen und Definitionen
f
f
d
a
e
d
(c,–)
c
a
b
f
e
c
(–,c)
b
f
e
c
(e,d)
d
a
d
d
b
a
b
Abbildung 2.2: Baum-Transformation.
(1) γ(a, b) ≥ 0,
(2) γ(a, a) = 0,
(3) γ(a, b) = γ(b, a),
(4) γ(a, c) ≤ γ(a, b) + γ(b, c).
Durch Erweiterung der Kostenfunktion γ auf eine Folge S = s1 , . . . , sk von EditOperationen, mit γ(S) = ∑ki=1 γ(si ), werden die Kosten einer gesamten BaumTransformation angegeben.
17
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
3 Vergleich von Bäumen über
Edit-Operationen
3.1 Baum-Edit-Distanz
3.1.1 Edit-Distanz-Abbildungen
Basierend auf einer Folge von Edit-Operationen wird ein Baum in einen anderen transformiert. Ziel ist es damit den Abstand bezüglich der Ähnlichkeit zwischen zwei Bäumen
zu berechnen. Daher wird für Bäume der Abstandsbegriff, genannt Baum-Edit-Distanz,
über die minimalen Kosten aller Folgen von Edit-Operationen festgelegt, die einen Baum
in einen anderen transformieren.
Definition 3.1 (Baum-Edit-Distanz)
Seien T1 und T2 beschriftete Bäume (geordnet oder ungeordnet) und sei eine Kostenfunktion
e × Σ)
e → R gegeben. Dann wird die Baum-Edit-Distanz zwischen T1 und T2 formal
γ : (Σ
folgendermaßen definiert:
δ (T1 , T2 ) = min{γ(S) | S ist eine Folge von Edit-Operationen, die T1 in T2 transformiert}.
Dabei gelten für δ alle Eigenschaften der Kostenfunktion γ, so dass δ ebenfalls eine
Distanz-Metrik ist. Die Bestimmung von δ (T1 , T2 ) wird in der englischen Literatur häufig
auch als das „tree-to-tree correction problem“ [Tai79] bezeichnet.
Entsprechend der Definition 3.1 für Edit-Distanz, gibt es unendlich viele Folgen von
Edit-Operationen, die den Baum T1 in T2 transformieren. Aus diesem Grund wird es unmöglich sein, alle gültigen Folgen von Edit-Operationen durchzugehen und die Folge mit
f
f
d
a
e
c
c
b
d
d
a
b
Abbildung 3.1: Edit-Distanz-Abbildung.
18
Approximative Suche in Baumstrukturen
den minimalen Kosten in überschaubarer Zeit zu bestimmen. Daher bedient man sich
eines Hilfsmittels und definiert spezielle Strukturen namens Edit-Distanz-Abbildungen
(engl. edit distance mappings), die eine effiziente Bestimmung der Edit-Distanz ermöglichen. Eine Edit-Distanz-Abbildung zwischen T1 und T2 stellt eine grafische Beschreibung
einer Folge von Edit-Operationen dar, die T1 in T2 transformiert. Im Gegensatz zu einer
Folge von Edit-Operationen ist die Reihenfolge der Anwendung von Edit-Operationen
bei einer Edit-Distanz-Abbildung unwichtig. Die Abbildung 3.1 zeigt beispielhaft eine
Edit-Distanz-Abbildung, welche mit der Folge von Edit-Operation aus Abbildung 2.2
korrespondiert. Dabei stehen zwei Knoten v ∈ T1 und w ∈ T2 , die durch eine Linie miteinander verbunden sind, in Korrespondenz. Eine derartige Korrespondenz repräsentiert
die Umbeschriftung des Knotens v mit dem Symbol T1 [v] durch das Symbol T2 [w], falls
T1 [v] 6= T2 [w] ist. Wenn die Symbole T1 [v] und T2 [w] gleich sind, bleiben beide Knoten
unverändert. Alle Knoten in T1 , die mit keinem Knoten aus T2 in Korrespondenz stehen, sind zu löschen. Umgekehrt sind alle Knoten in T2 , die mit keinem Knoten aus T1
in Korrespondenz stehen, in T1 einzufügen. Damit führt die Anwendung der grafischen
Vorschrift einer Edit-Distanz-Abbildung zwischen T1 und T2 analog der Folge von EditOperationen zu einer Transformation des Baumes T1 in T2 . Übereinstimmend mit der
Repräsentation einer Edit-Operation aus dem Abschnitt 2.2 werden die grafischen Beziehungen der gestrichelten Linie zwischen zwei Knoten bzw. Korrespondenzen durch
Paare ganzer Zahlen ausgedrückt. Für jede zwei Knoten v ∈ T1 und w ∈ T2 , die miteinander in Korrespondenz stehen, schreibt man das Paar (v, w). Die folgende Definition führt
diese informale Erklärung für geordnete Bäume formal aus.
Definition 3.2 (Geordnete Edit-Distanz-Abbildung)
Seien T1 , T2 geordnete beschriftete Bäume. Ein Tripel (M, T1 , T2 ) heißt eine geordnete EditDistanz-Abbildung zwischen T1 und T2 , falls M ⊆ {(v, w) | v ∈ V (T1 ), w ∈ V (T2 )} und für alle
Paare (v1 , w1 ), (v2 , w2 ) ∈ M folgende Eigenschaften gelten:
(1) v1 = v2 ⇐⇒ w1 = w2 (Eins-zu-eins-Bedingung),
(2) v1 ist ein Vorgänger von v2 ⇐⇒ w1 ist ein Vorgänger von w2 (Vorgänger-Bedingung),
(3) v1 liegt links von v2 ⇐⇒ w1 liegt links von w2 (Geschwister-Bedingung).
Die Bedingung (1) stellt sicher, dass jeder Knoten eines Baumes höchstens einmal mit
einem Knoten eines anderen Baumes in Korrespondenz steht. Damit verhindert man,
dass auf das Ergebnis einer Edit-Operation eine weitere Edit-Operation angewendet
wird. Die Bedingungen (2) und (3) stellen sicher, dass nachdem die nicht in einer
Korrespondenz stehenden Knoten aus T1 und T2 entfernt werden, T1 und T2 bezüglich
ihrer Struktur identisch sind. Hiermit sorgen diese Bedingungen dafür, dass nach der
Transformation, T1 die Struktur von T2 annimmt und dabei die festgelegte Ordnung
unter den Geschwistern in T2 bewahrt wird. Eine ungeordnete Edit-Distanz-Abbildung
zwischen zwei ungeordneten Bäumen wird auf die gleiche Weise definiert, jedoch ohne die Geschwister-Bedingung (3). Wenn es aus dem Kontext ersichtlich ist, wird statt
eines Tripels (M, T1 , T2 ) kurz M geschrieben.
Sei (M, T1 , T2 ) eine Edit-Distanz-Abbildung. Dann bezeichnet Mv = {v | (v, w) ∈ M} die
links-korrespondierende Menge von M und R1 = V (T1 )\Mv entsprechend die links-
19
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
nicht-korrespondierende Menge von M. Analog ist die rechts-korrespondierende Menge
Mw = {w | (v, w) ∈ M} und die rechts-nicht-korrespondierende Menge R2 = V (T2 )\Mw von
M definiert. Des Weiteren werden die Kosten einer Edit-Distanz-Abbildung M wie folgt
angegeben:
γ(M) =
∑
γ(T1 [v], T2 [w]) +
(v,w)∈M
∑ γ(T1[v], −) + ∑
v∈R1
γ(−, T2 [w])
w∈R2
Die Edit-Distanz δ (T1 , T2 ) kann über die minimalen Kosten aller Edit-DistanzAbbildungen zwischen T1 und T2 bestimmt werden.
Satz 3.1
Seien T1 und T2 beschriftete Bäume (geordnet oder ungeordnet) und sei eine Kostenfunktion
e × Σ)
e → R gegeben. Dann gilt:
γ : (Σ
δ (T1 , T2 ) = min{γ(M) | (M, T1 , T2 ) ist eine Edit-Distanz-Abbildung}.
Für den Beweis dieses Satzes müssen zunächst Aussagen über die Komposition von EditDistanz-Abbildungen verifiziert werden.
Satz 3.2
Seien T1 , T2 und T3 beschriftete Bäume. Sei weiterhin (M1 , T1 , T2 ) und (M2 , T2 , T3 ) eine EditDistanz-Abbildung. Dann ist:
(1) M1 ◦ M2 = {(v, w) | ∃u ∈ V (T2 ), so dass (v, u) ∈ M1 und (u, w) ∈ M2 } eine Edit-DistanzAbbildung zwischen T1 und T3 ,
(2) γ(M1 ◦ M2 ) ≤ γ(M1 ) + γ(M2 ).
Beweis:
(1) Seien (v1 , w1 ), (v2 , w2 ) ∈ M1 ◦ M2 . Dann existiert ein u1 und ein u2 , so dass
(v1 , u1 ), (v2 , u2 ) ∈ M1 und (u1 , w1 ), (u2 , w2 ) ∈ M2 ist. Aus der Definition 3.2 einer EditDistanz-Abbildung folgt:
(a) (v1 = v2 ⇐⇒ u1 = u2 ) und (u1 = u2 ⇐⇒ w1 = w2 ) =⇒ (v1 = v2 ⇐⇒ w1 = w2 ),
(b) (v1 ist ein Vorgänger von v2 ⇐⇒ u1 ist ein Vorgänger von u2 )
und (u1 ist ein Vorgänger von u2 ⇐⇒ w1 ist ein Vorgänger von w2 )
=⇒ (v1 ist ein Vorgänger von v2 ⇐⇒ w1 ist ein Vorgänger von w2 ),
(c) (v1 liegt links von v2 ⇐⇒ u1 liegt links von u2 )
und (u1 liegt links von u2 ⇐⇒ w1 liegt links von w2 )
=⇒ (v1 liegt links von v2 ⇐⇒ w1 liegt links von w2 ).
Folglich ist (M1 ◦ M2 , T1 , T3 ) laut der Definition 3.2 eine Edit-Distanz-Abbildung.
(2) Sei (M1 , T1 , T2 ) und (M2 , T2 , T3 ) eine Edit-Distanz-Abbildung. Sei (M1 ◦ M2 , T1 , T3 ) die
durch Komposition zusammengesetzte Edit-Distanz-Abbildung. Ferner sei R1 die
links-nicht-korrespondierende Menge und R2 die rechts-nicht-korrespondierende
Menge von M1 ◦ M2 . Dann treten im Zusammenhang mit M1 ◦ M2 drei Fälle auf:
20
Approximative Suche in Baumstrukturen
(v, w) ∈ M1 ◦ M2 , v ∈ R1 oder w ∈ R2 . Jeder Fall korrespondiert mit einer EditOperation, (T1 [v], T3 [w]), (T1 [v], −) oder (−, T3 [w]). Bei der Berechnung von Kosten
dieser Edit-Operationen gilt stets die Dreiecksungleichung der Distanz-Metrik γ,
d.h. γ(T1 [v], T3 [w]) ≤ γ(T1 [v], T2 [u]) + γ(T2 [u], T3 [w]).
• Ist (v, w) ∈ M1 ◦ M2 , dann gilt:
∑
γ(T1 [v], T3 [w]) ≤
(v,w)∈M1 ◦M2
∑
γ(T1 [v], T2 [u]) +
(v,u)∈M1
γ(T2 [u], T3 [w]).
∑
(u,w)∈M2
• Ist v ∈ R1 , dann zerfällt die Menge R1 in Knoten v0 , die mit Knoten u ∈ T2
in Korrespondenz stehen und in Knoten v00 , die nicht mit Knoten u ∈ T2 in
Korrespondenz stehen. Es gilt:
∑ γ(T1[v], −) ≤ ∑ γ(T1[v0], T2[u]) + γ(T2[u], −) + ∑ γ(T1[v00], −).
v∈R1
(v0 ,u)∈M1
v00 ∈R1
• Ist w ∈ R2 , dann zerfällt die Menge R2 in Knoten w0 , die mit Knoten u ∈ T2
in Korrespondenz stehen, und in Knoten w00 , die nicht mit Knoten u ∈ T2 in
Korrespondenz stehen. Es gilt:
∑ γ(−, T3[w]) ≤ ∑ γ(−, T2[u]) + γ(T2[u], T3[w0]) + ∑ γ(−, T3[w00]).
w∈R2
(u,w0 )∈M2
w00 ∈R2
Insgesamt folgt also γ(M1 ◦ M2 ) ≤ γ(M1 ) + γ(M2 ).
Folgender Satz stellt die Beziehung zwischen einer Edit-Distanz-Abbildung und einer
Folge von Edit-Operationen her.
Satz 3.3
(1) Für jede Edit-Distanz-Abbildung (M, T1 , T2 ) gibt es eine Folge S = s1 , . . . , sk von EditOperationen, die T1 in T2 transformiert, mit γ(S) = γ(M).
(2) Umgekehrt gibt es für jede Folge S = s1 , . . . , sk von Edit-Operationen, die T1 in T2
transformiert, eine Edit-Distanz-Abbildung (M, T1 , T2 ) mit γ(M) ≤ γ(S).
Beweis:
(1) Sei (M, T1 , T2 ) eine Edit-Distanz-Abbildung. Seien R1 , R2 entsprechend die linksnicht-korrespondierende und die rechts-nicht-korrespondierende Menge von M.
Setze:
S = ((T1 [v], T2 [w]) für (v, w) ∈ M, (T1 [v], −) für v ∈ R1 , (−, T2 [w]) für w ∈ R2 ) .
Offensichtlich transformiert die Folge S den Baum T1 in T2 mit γ(S) = γ(M).
(2) Sei S eine Folge s1 , . . . , sk von Edit-Operationen. S transformiert T1 in T2 , d.h. es
s
gibt eine Folge von Bäumen A0 , . . . , Ak , so dass T1 = A0 , T2 = Ak und Ai−1 ⇒
=i Ai für
1 ≤ i ≤ k. Die Behauptung zeigt man dann durch vollständige Induktion:
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
21
• k = 0: Dann ist T1 = T2 und S = (). Setze M = {(v, v) | v ∈ V (T1 )}, dann ist
(M, T1 , T2 ) eine Edit-Distanz-Abbildung und es folgt γ(S) = γ(M) = 0.
• k > 0: Sei S1 eine Folge s1 , . . . , sk−1 von Edit-Operationen, die T1 in Ak−1 transformiert. Laut Induktionsvoraussetzung existiert eine Edit-Distanz-Abbildung
(M1 , T1 , Ak−1 ), so dass γ(M1 ) ≤ γ(S1 ) ist. Sei (M2 , Ak−1 , T2 ) eine Edit-DistanzAbbildung für die Edit-Operation sk . Aus Satz 3.2 folgt:
γ(M1 ◦ M2 ) ≤ γ(M1 ) + γ(M2 ) ≤ γ(S1 ) + γ(sk ) = γ(S).
Der Beweis für den Satz 3.1 folgt sofort aus der oben gezeigten Beziehung zwischen
einer Edit-Distanz-Abbildung und einer Folge von Edit-Operationen. Damit kann die
Berechnung der Edit-Distanz auf die Suche nach einer Edit-Distanz-Abbildung mit minimalen Kosten reduziert werden. Eine Edit-Diszanz-Abbildung zwischen zwei Bäumen
T1 und T2 mit minimalen Kosten wird als eine optimale Edit-Distanz-Abbildung zwischen
T1 und T2 bezeichnet. Die Definition der Baum-Edit-Distanz lässt sich ohne Weiteres auf
Wälder verallgemeinern und wird demgemäß als Wald-Edit-Distanz bezeichnet. Demzufolge bezeichnet δ (F1 , F2 ) die Edit-Distanz zwischen einem Wald F1 und F2 . Hierbei
sind die Edit-Operationen für Bäume und Wälder gleich definiert. Die Definition der
Edit-Distanz-Abbildung wird analog auf Wälder erweitert.
3.1.2 Rekursionsformel zur Berechnung der Edit-Distanz
In der Wissenschaftlichen Publikation von Zhang und Shasha [ZS89] findet sich eine
Rekursionsformel, mit der es möglich ist unter Ausnutzung dynamischer Programmiermethoden [CSRL01] die Edit-Distanz zwischen zwei Bäumen zu berechnen. Dabei wird
eine optimale Gesamtlösung aus optimalen Lösungen von Teilproblemen konstruiert.
Diese Rekursionsformel bildet die Basis für weitere dynamische Programmieralgorithmen zur Berechnung der Edit-Distanz, die in folgendem Kapitel dieser Arbeit vorgestellt
werden.
Satz 3.4
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ V (T1 ), w ∈ V (T2 ), i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
Dann gelten folgende Rekursionen:
(1) δ (θ , θ ) = 0,
(2) δ (T1 [l(v)..i], θ ) = δ (T1 [l(v)..i − 1], θ ) + γ(T1 [i], −),
(3) δ (θ , T2 [l(w).. j]) = δ (θ , T2 [l(w).. j − 1]) + γ(−, T2 [ j]),


δ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),





δ (T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),
(4) δ (T1 [l(v)..i], T2 [l(w).. j]) = min δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])



+δ (T1 [l(i)..i − 1], T2 [l( j).. j − 1])



 +γ(T [i], T [ j]).
1
2
22
Approximative Suche in Baumstrukturen
(i,j)
...
...
T1[l(v)..l(i)-1]
T1[l(i)..i-1]
T2[l(w)..l(j)-1]
T2[l(j)..j-1]
Abbildung 3.2: Dritter Fall der Rekursionsformel (4) des Satzes 3.4.
Beweis:
Im ersten Fall müssen keine Edit-Operationen ausgeführt werden. Für die Kosten im
zweiten Fall werden nur Lösch-Operationen und im dritten Fall nur Einfüge-Operationen
berücksichtigt. Im vierten Fall wird eine optimale Edit-Distanz-Abbildung M zwischen
T1 [l(v)..i] und T2 [l(w).. j] betrachtet, wobei R1 die links-nicht-korrespondierende und R2
die rechts-nicht-korrespondierende Menge von M bezeichnet. Dabei ergeben sich für die
Knoten i ∈ T1 [l(v)..i] und j ∈ T2 [l(w).. j] insgesamt folgende drei Möglichkeiten:
• i ∈ R1 : Dann muss i in T1 [l(v)..i] gelöscht werden. Also,
δ (T1 [l(v)..i], T2 [l(w).. j]) = δ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −).
• j ∈ R2 : Dann muss j in T1 [l(v)..i] eingefügt werden. Also,
δ (T1 [l(v)..i], T2 [l(w).. j]) = δ (T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]).
• i steht in Korrespondenz mit j : Dann ist (i, j) ∈ M. Diese Feststellung leitet sich
aus folgender Überlegung heraus. Angenommen (i, h), (k, j) ∈ M. Falls l(v) ≤ k ≤
l(i) − 1, dann liegt i rechts von k. Aus der Geschwister-Bedingung (3) folgt, dass
hier auch h rechts von j liegen muss. Falls l(i) ≤ k < i, dann ist i ein echter Vorgänger von k. Entsprechend der Vorgänger-Bedingung (2) muss h auch ein echter
Vorgänger von j sein. Da aber i und j die rechtesten Wurzeln der Wälder T1 [l(v)..i]
und T2 [l(w).. j] sind, können diese beiden Fälle nicht auftreten. Also folgt k = i. Aus
der Eins-zu-eins-Bedingung (1) ergibt sich schließlich h = j und (i, j) ∈ M.
Durch die Vorgänger-Bedingung (2) der Edit-Distanz-Abbildung können Knoten
des Teilbaumes mit der Wurzel i nur auf Knoten des Teilbaumes mit der Wurzel j
abgebildet werden (siehe Abbildung 3.2). Daher folgt:
δ (T1 [l(v)..i], T2 [l(w).. j]) = δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1]
+δ (T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j]).
Da die oben diskutierten Möglichkeiten alle Fälle einer Edit-Distanz-Abbildung zwischen
T1 [l(v)..i] und T2 [l(w).. j] abdecken und nur eine optimale Edit-Distanz-Abbildung von
Interesse ist, bildet man anschließend das Minimum ihrer Kosten.
23
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
3.2 Baum-Alignment-Distanz
Eine andere Möglichkeit die Ähnlichkeit von Bäumen festzustellen, die ebenfalls auf
Edit-Operationen beruht, bietet die Baum-Alignment-Distanz. Trotz der guten und
sinnvollen Ergebnisse einer Distanzmessung zweier Baumstrukturen über die EditDistanz, hat man damit in bestimmten Bereichen, z.B. beim Vergleich der RNASekundärstrukturen, nur ein approximierendes Verfahren der wirklichen funktionalen
Ähnlichkeit. Viele morphologische oder genetische Probleme, die eine Modellierung mit
ungeordneten Bäumen erfordern, sind mit Edit-Distanz-Algorithmen nur schwer zu lösen. So ist die Bestimmung der Edit-Distanz zweier ungeordneter Bäume bereits NP-hart
[ZSS92]. Um diese Schwierigkeiten überwinden zu können, führten Jiang, Wang und
Zhang in [JWZ95] erstmals ein anderes Messungsverfahren der Ähnlichkeit von Bäumen ein, das auf ihren Ausrichtungen (engl. alignments) basiert.
Zwei Bäume T1 und T2 werden gegeneinander ausgerichtet, indem in T1 und T2 Knoten
beschriftet mit Blank-Symbolen derart eingefügt werden, dass die resultierenden Bäume
0
0
T1 und T2 bezüglich ihrer Struktur identisch sind. Eine Ausrichtung A von Bäumen T1
0
0
und T2 ergibt sich anschließend, indem T1 mit T2 überlagert wird. Demgemäß stellt eine
Ausrichtung von T1 und T2 einen Baum dar, dessen Knoten infolge der Überlagerung
0
0
e × Σ)\(−,
e
−) von Symbolen beschriftet sind. Ein
von T1 mit T2 mit Paaren (a, b) ∈ (Σ
0
0
solches Paar setzt sich aus einem Symbol a ∈ T1 und b ∈ T2 zusammen (siehe Abbildung
3.3). Formal lässt sich die Definition einer Ausrichtung von Zeichenketten auf Bäume
transferieren (vgl. [Par07]). Dazu sei zunächt der Kompressionsoperator µ auf Knoten v
von T durch
(
lösche v,
falls T [v] = −
µ(v) =
keine Operation, sonst
0
gegeben. Dann sei µ : Te → TΣ der durch den Kompressionsoperator gegebene HomoΣ
e auf Bäume T 0 über Σ ab,
morphismus. Der Homomorphismus µ bildet Bäume T über Σ
indem er auf alle Knoten von T den Kompressionsoperator µ anwendet.
Definition 3.3 (Ausrichtung)
0
0
e die folgende Eigenschaften
Seien T1 und T2 Bäume über Σ. Seien T1 und T2 Bäume über Σ,
erfüllen:
0
0
(1) µ(T1 ) = T1 und µ(T2 ) = T2 ,
0
0
(2) T1 und T2 sind bezüglich ihrer Struktur identisch,
0
0
0
(3) Es ist T1 [i] 6= − oder T2 [i] 6= −, für 1 ≤ i ≤ |T1 |.
0
0
Dann ist die Ausrichtung A von T1 und T2 , der aus der Überlagerung von T1 mit T2 resultierende Baum.
Sei A eine Ausrichtung von T1 und T2 . Dann werden die Kosten von A, als die Summe
24
Approximative Suche in Baumstrukturen
aller Paare von Symbolen der Knoten von A angegeben:
γ(A) =
∑
γ(A[v]).
v∈V (A)
Die Baum-Alignment-Distanz wird als Kosten einer Ausrichtung von zwei Bäumen T1
und T2 definiert, die unter allen möglichen Ausrichtungen von T1 und T2 die minimalen
Kosten liefert.
Definition 3.4 (Baum-Alignment-Distanz)
Seien T1 und T2 beschriftete Bäume (geordnet oder ungeordnet) und sei eine Kostenfunktion
e × Σ)
e → R gegeben. Dann wird die Baum-Alignment-Distanz zwischen T1 und T2
γ : (Σ
formal folgendermaßen definiert:
α(T1 , T2 ) = min{γ(A) | A ist eine Ausrichtung von T1 und T2 }.
Eine optimale Ausrichtung von T1 und T2 ist eine Ausrichtung A∗ von T1 und T2 , deren
Kosten minimal sind, d.h. eine Ausrichtung für die
α(T1 , T2 ) = γ(A∗ )
gilt. Die Definition der Ausrichtung von Bäumen lässt sich auch auf Wälder erweitern.
Im Vergleich zu Bäumen wird bei den Wäldern auch eine Einfüge-Operation zugelassen, die einen Knoten als Wurzel einfügt, der eine aufeinander folgende Teilfolge (bei
geordneten Wäldern) bzw. eine Teilmenge (bei ungeordneten Wäldern) von einzelnen
Bäumen des Waldes miteinander verbindet. Im Falle von Wäldern bezeichnet α(F1 , F2 )
die Alignment-Distanz zwischen einem Wald F1 und F2 .
Bekanntlich liefern die Edit- und Alignment-Distanz zwischen zwei beliebigen Zeichenketten den gleichen Wert und sind deshalb für Zeichenketten äquivalent. Im Gegensatz dazu ergeben sich für die Edit- und Alignment-Distanz im Fall der Bäume unterschiedliche Resultate. Die Baum-Alignment Distanz stellt einen Spezialfall der BaumEdit-Distanz dar. Sie korrespondiert mit der beschränkten Baum-Edit-Distanz, wo alle
Einfüge- vor Lösch-Operationen ausgeführt werden müssen. Aus diesem Grund gilt stets
δ (T1 , T2 ) ≤ α(T1 , T2 ).
Beispiel:
Als Beispiel betrachte die zwei gegebenen Bäume T1 und T2 in Abbildung 3.3. Nehme
weiterhin an, dass alle Edit-Operationen die Kosten 1 haben. Eine optimale Folge von
Edit-Operationen, deren Kosten die Edit-Distanz liefern, ergibt sich, wenn zuerst der
Knoten mit dem Symbol e gelöscht und anschließend der Knoten mit dem Symbol f
in T1 eingefügt wird. Folglich hat die Edit-Distanz zwischen T1 und T2 den Wert 2. Da
die Kosten der optimalen Ausrichtung von T1 und T2 in Abbildung 3.3 aber den Wert 4
haben, beträgt die Baum-Alignment-Distanz α(T1 , T2 ) = 4.
Ein weiteres Unterschied zwischen der Baum-Edit- und Baum-Alignment-Distanz besteht in der Komplexität ihrer geordneten und ungeordneten Probleme. Für ungeordnete Bäume kann das Alignment-Problem in polynomieller Zeit gelöst werden, wenn die
25
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
T1
T2
a
e
b
d
a
b
f
c
c
d
(a)
T 1'
T 2'
a
–
e
b
c
–
a
–
d
b
f
–
c
d
(b)
A
(a,a)
(e,–)
(–, f )
(b,b) (c,–)
(–,c) (d,d)
(c)
Abbildung 3.3: (a) Bäume T1 und T2 .
0
0
(b) Ausgerichtete Bäume T1 und T2 .
(c) Eine Optimale Ausrichtung von T1 und T2 .
vorgegebenen Bäume in ihrem Grad beschränkt sind. Jiang, Wang und Zhang gaben für
diesen Fall in [JWZ95] einen Algorithmus an, der die ungeordnete Baum-AlignmentDistanz in O(|T1 | · |T2 |) Zeit berechnet. Ist der Grad eines Baumes nicht beschränkt, so
gehört das Alignment-Problem zur Komplexitätsklasse NP-Hart [JWZ95]. Im Gegensatz
dazu gehört die Bestimmung der ungeordneten Baum-Edit-Distanz in beiden Fällen zu
den Problemen aus der Komplexitätsklasse NP-hart [ZSS92]. Zhang und Jiang haben
sich in [ZJ94] genauer mit der Analyse des ungeordneten Edit-Distanz-Problems auseinander gesetzt. Darin zeigten sie, dass die Bestimmung der Edit-Distanz zwischen
ungeordneten Bäumen zu den Problemen aus der Komplexitätsklasse MAX SNP-hart
zählt1 .
1 Die
Komplexitätsklasse MAX SNP-hart wurde erstmals von Papadimitriou und Yannakakis in [PY88]
definiert.
26
Approximative Suche in Baumstrukturen
3.3 Baum-Inklusion-Problem
Neben der Baum-Edit- und der Baum-Alignment-Distanz führt der Vergleich von Bäumen mit Hilfe von Edit-Operationen auf das sogenannte Baum-Inklusion-Problem. Dabei
geht es um die Beantwortung der Frage, ob sich ein gegebener Baum P bzw. der PatternBaum aus einem anderen gegebenen Baum T erhalten lässt, wenn mehrere Knoten aus
T gelöscht werden können. Man sagt auch, dass der Baum P in dem Baum T eingeschlossen ist, wenn sich P durch Löschung von Null oder mehr Knoten aus T ergeben
kann. Falls dem so ist, interessiert man sich für die Knoten von T , die nicht gelöscht
wurden bzw. für den kleinsten Teilwald von T , der P einschließt. Ist der Pattern-Baum
P nicht in T eingeschlossen, dann ist zumindest ein Teilbaum von T erwägenswert, der
zu P am ähnlichsten ist. Daher ähnelt dieses Problem dem in Kapitel 6 beschriebenen
approximativen Baum-Matching-Problem, wo es darum geht, bestimmte Teilstrukturen
in einem gegebenen Baum zu finden, die zu einem anderen gegebenen Baum am ähnlichsten sind.
Das Baum-Inklusion-Problem tritt häufig in Zusammenhang mit strukturierten Textdatenbanken auf. Eine strukturierte Textdatenbank stellt eine Sammlung von Parse- bzw.
Ableitungsbäumen dar, die die Struktur von den gespeicherten Dokumenten repräsentieren [GT87, TSM91]. In vielen Fällen werden Abfragen an eine Textdatenbank gerichtet, in denen bestimmte Textpassagen eines Dokumentes gefunden und, falls vorhanden,
abgerufen werden sollen. Dabei enthalten die Abfragen meistens keine feste Vorgaben,
sondern gewisse Muster, die zu mehreren unterschiedlichen Textstellen passen. Als Beispiel sollen hier Anfragen an eine Textdatenbank über grammatikalische Strukturen
einer natürlichen Sprache betrachtet werden. Abbildung 3.4a zeigt beispielhaft einen
Parsebaum eines Satzes der deutschen Sprache. Jetzt soll die Textdatenbank abgefragt
werden und alle diejenigen Sätze liefern, die eine Verbgruppe, bestehend aus einem finiten Verb „hat“, einem Nomen „Buch“ und einem beliebigen infiniten Verb, beinhalten,
bei der die einzelnen Satzglieder in der aufgeschriebenen Reihenfolge auftreten müssen.
Daraufhin bietet sich für die Textdatenbank eine Möglichkeit, einen Parsebaum (den
Pattern-Baum) entsprechend der vorgegebenen Verbgruppe, wie in Abbildung 3.4b, zu
erstellen und dann nach allen Sätzen in der Datenbank zu suchen, deren Parsebäume
den Pattern-Baum einschließen. In diesem Fall sind das alle diejenigen Sätze, deren
Parsebäume sich nur durch die Löschung von Knoten in den erstellten Pattern-Baum
transformieren lassen. Formal lässt sich das Baum-Inklusion-Problem wie folgt definieren.
Definition 3.5 (Das Baum-Inklusion-Problem)
Gegeben ist ein Baum P (der Pattern-Baum) und ein Baum T . Sei s1 , . . . , sk eine Folge von
Lösch-Operationen. Das Baum-Inklusion-Problem ist das folgende: Gibt es eine Folge von
s
Bäumen A0 , . . . Ak , so dass T = A0 , P = Ak und Ai−1 ⇒
=i Ai für 1 ≤ i ≤ k.
Die Abbildung 3.5 zeigt anschaulich ein Beispiel einer Baum-Inklusion.
Das Baum-Inklusion-Problem hat zwei folgende wichtige Eigenschaften:
• Es ist ein Spezialfall des Edit-Distanz-Problems. Da bei den Edit-Operationen die
27
Kapitel 3. Vergleich von Bäumen über Edit-Operationen
Satz
Nomengruppe
Verbgruppe
Artikel
Nomen
Verb
„Der“
„Junge“
„hat“
Nomengruppe
Verb
Artikel
Adjektiv
Nomen
„ein“
„großes“
„Buch“
„gekauft“
(a)
Satz
Verbgruppe
Verb
Nomen
„hat“
„Buch“
Verb
(b)
Abbildung 3.4: (a) Parsebaum eines Satzes.
(b) Ein eingeschlossener Baum des Parsebaumes unter (a).
28
Approximative Suche in Baumstrukturen
T=A0
d
a
A1
f
e
c
d
(c,–)
a
A2
f
e
b
(a,–)
P=A3
f
d
e
(d,–)
b
f
e
b
b
Abbildung 3.5: Beispiel einer Baum-Inklusion. Der Baum P ist in dem Baum T
eingeschlossen.
Einfügung von Knoten das Komplement von deren Löschung bildet, kann man,
um zu entscheiden, ob P in T eingeschlossen ist, statt Knoten in T zu löschen, sie
in P einfügen und dann P mit T vergleichen. In diesem Fall muss aber beachtet
werden, dass die Einfügung von Knoten nicht zu den Gesamtkosten der Transformation beiträgt, weil die Edit-Distanz die minimalen Kosten einer Transformation
angibt. Setzt man jetzt für alle Einfügungen die Kosten 0 und für alle anderen
Edit-Operationen die Kosten 1, dann ist P in T genau dann eingeschlossen wenn
δ (P, T ) = 0.
• Das Baum-Inklusion-Problem ist auch ein Spezialfall des Alignment-DistanzProblems. Haben P und T die gleiche Anzahl von Knoten, so ist P in T nur dann
eingeschlossen, wenn P = T , da sonst durch das Löschen von Knoten aus T , der
Pattern-Baum P sich nicht mehr erhalten lässt. Also müssen in diesem Fall die
Kosten der Ausrichtung zwischen P und T gleich |T | − |P| = 0 sein, wenn P in T
eingeschlossen sein soll. Haben P und T unterschiedlich viele Knoten, dann ist P
in T nur dann eingeschlossen, wenn die Anzahl der, mit dem Blank-Symbol bei
der Ausrichtung von P gegen T in P, eingefügten Knoten gleich |T | − |P| ist. Aus
diesem Grund ist P in T genau dann eingeschlossen, wenn α(P, T ) = |T | − |P| und
man dabei die Kosten für alle Edit-Operationen gleich 1 setzt.
Das Baum-Inklusion-Problem wurde ursprünglich von Knuth in [Knu69] (vgl. Übung
2.3.2-22) eingeführt. Durch die, in Zusammenhang mit den strukturierten Textdatenbanken auftauchenden Probleme, immer mehr wachsende Bedeutung dieses Problems,
war es der Gegenstand vieler Forschungsarbeiten. Der erste polynomielle Algorithmus zur Lösung des Baum-Inklusion-Problems wurde von Kilpeläinen und Mannila
[KM95] angegeben und benötigt für seine Ausführung O(|P| · |T |) Zeiteinheiten und
Speicherplatz. Darüber hinaus untersuchten sie in [KM95] das Problem für ungeordnete Bäume und konnten nachweisen, dass es NP-Vollständig ist, falls der Grad von
T nicht beschränkt ist. Zudem gaben sie einen Algorithmus an, der das ungeordnete
Baum-Inklusion-Problem in einer polynomiellen Zeit löst, falls der Grad von T durch
O(log(|T |)) beschränkt ist und dabei nur O(|P| · |T |) Zeit benötigt, falls der Grad von
T konstant ist. Weimin Chen gab in [Che98] einen weitaus komplexeren Algorithmus
zur Lösung des geordneten Baum-Inklusion-Problems an, der O(|L(P)| · |T |) Zeit und
O(L(P) · min{depth(T ), |L(T )|}) Speicher benötigt.
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
29
4 Verfahren zur Berechnung der
Baum-Edit-Distanz
4.1 Zhang-Shasha-Algorithmus
Dieses Kapitel stellt den Zhang-Shasha-Algorithmus [ZS89] vor. Der Zhang-ShashaAlgorithmus berechnet die Edit-Distanz zweier Bäume und löst somit das „tree-to-tree
correction problem“, indem er die Rekursionsformeln aus dem Satz 3.4 mit Hilfe dynamischer Programmierung umsetzt. Die Verwendung der dynamischen Programmierung
wird hier deshalb eingesetzt, weil die Edit-Distanzen in den Rekursionsformeln von den
Teilproblemen kleinerer Größe abhängen, die wiederum kleinere Teilprobleme teilen.
Ein Teilproblem repräsentiert in diesem Fall, die Berechnung einer Edit-Distanz zweier
Baumstrukturen mit einer geringeren Anzahl von Knoten als der Baumstrukturen des
anfänglich zu lösenden Problems. Hierbei können die Teilprobleme sowohl die Berechnung der Baum- als auch der Wald-Edit-Distanz darstellen. Untersucht man die Teilprobleme für Bäume und Wälder getrennt voneinander, so lässt sich die Rekursionsformel
(4) in zwei Teile zerlegen. Liegt i auf dem Pfad von l(v) nach v und j auf dem Pfad von
l(w) nach w, dann ist l(i) = l(v) und l( j) = l(w), so dass δ (T1 [l(v)..i], T2 [l(w).. j]) die Berechnung der Edit-Distanz zweier Bäume ausdrückt. Anderenfalls wird die Edit-Distanz
zwischen zwei Wäldern berechnet.
Satz 4.1
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ T1 , w ∈ T2 , i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
(1) Falls l(i) = l(v) und l( j) = l(w), dann gilt:


δ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),
δ (T1 [l(v)..i], T2 [l(w).. j]) = min δ (T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),


δ (T1 [l(v)..i − 1], T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
(2) Sonst:

δ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),



δ (T [l(v)..i], T [l(w).. j − 1]) + γ(−, T [ j]),
1
2
2
δ (T1 [l(v)..i], T2 [l(w).. j]) = min

δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])



+δ (T1 (i), T2 ( j)).
30
Approximative Suche in Baumstrukturen
(i,j)
T1[l(i)..i-1]
T2[l(j)..j-1]
(a) Dritter Fall der Rekursionsformel für einen Baum
...
T1[l(v)..l(i)-1]
...
T1(i)
T2[l(w)..l(j)-1]
T2(j)
(b) Dritter Fall der Rekursionsformel für einen Wald
Abbildung 4.1: Zwei Situationen des Satzes 4.1.
Beweis:
(1) Setze l(i) = l(v) und l( j) = l(w) in die Rekursionsformel (4) des Satzes 3.4
ein. Dann folgt sofort die gesuchte Rekursionsformel (1), da δ (T1 [l(v)..l(v) −
1], T2 [l(w)..l(w) − 1]) = δ (θ , θ ) = 0.
(2) Um T1 [l(v)..i] in T2 [l(w).. j] zu transformieren, kann man zunächst T1 [l(v)..l(i) − 1]
auf T2 [l(w)..l( j) − 1] und dann den übrig gebliebenen Baum T1 (i) auf T2 ( j) abbilden. Ähnlich kann der Baum T1 (i) in T2 ( j) transformiert werden, indem man
zunächst T1 [l(i)..i − 1] auf T2 [l( j).. j − 1] und dann den restlichen Knoten i auf j
abbildet. Da diese Möglichkeiten aber einen Spezialfall darstellen, können sie suboptimal sein und deshalb nicht zu einer optimalen Edit-Distanz-Abbildung führen.
Daher lässt sich diese Situation durch folgende zwei Ungleichungen ausdrücken.
(a) δ (T1 [l(v)..i], T2 [l(w).. j]) ≤ δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
+ δ (T1 (i), T2 ( j))
(b) δ (T1 (i), T2 ( j)) ≤ δ (T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j])
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
31
Aus den Ungleichungen (a) und (b) folgt:
δ (T1 [l(v)..i], T2 [l(w).. j]) ≤ δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
+ δ (T1 (i), T2 ( j))
≤ δ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
+ δ (T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j])
Damit kann der Ausdruck δ (T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j]) durch
δ (T (i), T ( j)) ersetzt werden.
Die Abbildung 4.1 verdeutlicht beispielhaft die zwei auftretenden Situationen des Satzes 4.1.
Aus den Rekursionen des Satzes 4.1 ergibt sich, dass die im Laufe der Berechnung
von δ (T1 , T2 ) zu lösenden Teilprobleme entweder die Edit-Distanzen der Teilbäume von
T1 und T2 oder die Edit-Distanzen der Präfixe dieser Teilbäume darstellen. Beim Betrachten der Rekursionsformel (2) erkennt man, dass zur Berechnung der Edit-Distanz
δ (T1 (v), T2 (w)) alle Edit-Distanzen δ (T (i), T ( j)) für i ∈ T1 (v), j ∈ T2 (w) mit l(i) 6= l(v)
oder l( j) 6= l(w) gebraucht werden. Weiterhin stellt man durch Anwendung der Rekursionsformel (1) fest, dass nicht alle Edit-Distanzen der Teilbäume von T1 (v) und
T2 (w) explizit berechnet werden müssen. Liegt i auf dem Pfad von l(v) nach v und
j auf dem Pfad von l(w) nach w, dann wird die Edit-Distanz δ (T1 (i), T2 ( j)) zur Berechnung von δ (T1 (v), T2 (w)) nicht benötigt. Infolgedessen ist δ (T1 [l(v)..i], T2 [l(w).. j]) =
δ (T1 [l(i)..i], T2 [l( j).. j]) = δ (T1 (i), T2 ( j)). In diesem Fall ist δ (T1 (i), T2 ( j)) ein Präfix von
δ (T1 (v), T2 (w)) und kann implizit nur aus den Präfixen von T1 (v) und T2 (w) bestimmt
werden. Wurzeln der echten Teilbäume eines Baumes T , die in einem größeren und sie
umfassenden Teilbaum T (v) für v ∈ T nicht auf dem Pfad von l(v) nach v liegen, haben
immer ein echtes linkes Geschwister in T . Aus diesem Grund müssen zur Bestimmung
der Edit-Distanz δ (T1 , T2 ) tatsächlich nur alle diejenigen Edit-Distanzen δ (T1 (v), T2 (w))
der echten Teilbäume von T1 und T2 explizit berechnet werden, wo die Knoten v und w
in ihren Bäumen ein echtes linkes Geschwister haben. Die Wurzeln von Bäumen der im
Algorithmus explizit zu berechnenden Edit-Distanzen werden als Schlüsselknoten (engl.
key nodes1 ) bezeichnet. Die folgende Definition gibt die Schlüsselknoten folmal an.
Definition 4.1 (Schlüsselknoten)
Sei T ein gewurzelter geordneter Baum. Dann sind die Schlüsselknoten von T wie folgt
definiert:
K(T ) = {root(T )} ∪ {v ∈ V (T ) | v hat ein echtes linkes Geschwister}.
Teilbäume eines Baumes T , deren Wurzeln die Schlüsselknoten von T sind, werden
spezielle Teilbäume von T genannt. Die Präfixe aller speziellen Teilbäume von T werden
als relevante Teilstrukturen von T bezeichnet.
1 In
der originalen wissenschaftlichen Publikation von Zhang und Shasha [ZS89] und von einigen anderen Autoren in der Literatur werden diese Knoten auch als „key roots“ bezeichnet.
32
Approximative Suche in Baumstrukturen
Abbildung 4.2: Zerlegung eines Baumes in linkeste Pfade. Linkeste Pfade sind
fett abgedruckt. Gefüllte Knoten stellen Schlüsselknoten des
Baumes dar.
Die Idee des Zhang-Shasha-Algorithmus besteht darin, die Edit-Distanzen
δ (T1 (v), T2 (w)) für alle v ∈ K(T1 ) und w ∈ K(T2 ) gemäß den Prinzipien dynamischer Programmierung zu berechnen. Hierfür wird die Funktion compute_delta konstruiert,
die für alle Paare von Schlüsselknoten v und w, in der Reihenfolge ihrer Nummerierung
in Postordnung, bottom-up aufgerufen wird und die Distanzen δ (T1 [l(v)..i], T2 [l(w).. j])
für alle i ∈ {l(v), . . . v} und j ∈ {l(w)..w} basierend auf den Sätzen 3.4 und 4.1 berechnet.
Die berechneten Baum-Edit-Distanzen werden dabei in einer |T1 | × |T2 |-Distanzmatrix
treeDist permanent gespeichert, damit sie bei Bedarf in konstanter Zeit abgerufen
werden können. Der Eintrag treeDist[i, j] wird im Laufe des Algorithmus die EditDistanz δ (T1 (i), T2 ( j)) haben. Des Weiteren berechnet der Algorithmus für alle Paare
spezieller Teilbäume von T1 und T2 die Edit-Distanzen zwischen allen ihren Präfixen
in aufsteigender Größe und speichert sie temporär in einer (|T1 | + 1) × (|T2 | + 1)Distanzmatrix forestDist. Hierbei wird während der Berechnung einer Edit-Distanz
zweier spezieller Teilbäume T1 (v), T2 (w) dem Eintrag forestDist[i, j] die Edit-Distanz
δ (T1 [l(v)..i], T2 [l(w).. j]) zwischen einem Präfix von T1 (v) und einem Präfix von T2 (w)
zugewiesen. Die Distanzmatrix forestDist wird für jedes Paar von speziellen Teilbäumen wiederverwendet. Nach der Ausführung des Algorithmus besitzt der Eintrag
treeDist[|T1 |, |T2 |] die gesuchte Edit-Distanz δ (T1 , T2 ).
Ein gewurzelter Baum T lässt sich in linkeste Pfade zerlegen, indem man ausgehend von
jedem Schlüsselknoten immer via den linkesten Kindern bis zu einem Blattknoten absteigt. Sei left(v) das linkeste Kind von v und v ∈ K(T ), wobei v einen Nicht-Blattknoten
angibt. Für einen Blattknoten ist left(v) = v. Die Folge von Knoten
v, left(v), left(left(v)), . . .
definiert den absteigenden linken Pfad von T (v). Die Schlüsselknoten bilden also die
ersten Knoten der linkesten Pfade (siehe Abbildung 4.2) und können auf folgende Weise
algorithmisch bestimmt werden:
(1) Lösche das linkeste Blatt des Baumes und alle seine Vorgänger. Der letzte Vorgänger dieses Blattes ist ein Schlüsselknoten.
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
33
Eingabe : Knoten v ∈ K(T1 ) und w ∈ K(T2 ).
Ausgabe: {δ (T1 [l(v)..i], T2 [l(w).. j]) | i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}}.
/* forestDist[0..|V (T1 )|,0..|V (T2 )] ist die temporäre
Distanzmatrix
/* treeDist[1..|V (T1 )|,1..|V (T2 )|] ist die permanente
Distanzmatrix
/* γ ist die Kostenfunktion
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
*/
*/
*/
θ1 := l(v) − 1.
θ2 := l(w) − 1.
forestDist[θ1 , θ2 ] = 0
for i := l(v) to v do
forestDist[i, θ2 ] = forestDist[i − 1, θ2 ] + γ(T1 [i], −).
for j := l(w) to w do
forestDist[θ1 , j] = forestDist[θ1 , j − 1] + γ(−, T2 [ j]).
for i := l(v) to v do
for j := l(w) to w do
if l(i) = l(v) and l( j) = l(w)
 then

forestDist[i − 1, j] + γ(T1 [i], −);
forestDist[i, j] := min forestDist[i, j − 1] + γ(−, T2 [ j]);


forestDist[i − 1, j − 1] + γ(T1 [i], T2 [ j]).
treeDist[i, j] := forestDist[i, j].
else


forestDist[i − 1, j] + γ(T1 [i], −);
forestDist[i, j] := min forestDist[i, j − 1] + γ(−, T2 [ j]);


forestDist[l(i) − 1, l( j) − 1] + treeDist[i, j].
Funktion compute_delta(v, w)
(2) Wiederhole Schritt (1) bis keine Blätter mehr vorhanden sind.
Offensichtlich gibt es in einem Baum genauso viele Schlüsselknoten wie Blätter.
Satz 4.2
Sei T ein geordneter Baum. Dann gilt:
|K(T )| = |L(T )|.
Vor der Ausführung des Zhang-Shasha-Algorithmus werden in der Vorbereitungsphase
die Schlüsselknoten K(T1 ) und K(T2 ) bestimmt und jeweils in einem Hilfsfeld entsprechend ihrer Position in der Postordnung aufsteigend gespeichert. Außerdem wird auch
l(v) für alle v ∈ V (T1 ), w ∈ V (T2 ) vorberechnet und in einem Hilfsfeld gespeichert. Offensichtlich benötigt die Vorbereitungsphase für ihre Berechnungen eine lineare Zeit.
Damit lässt sich jetzt ein Algorithmus konstruieren, der die Edit-Distanz zweier Bäume
34
Approximative Suche in Baumstrukturen
T1 , T2 in O(|T1 | · |T2 | · min{depth(T1 ), L(T1 )} · min{depth(T2 ), L(T2 )}) Zeit und O(|T1 | · |T2 |)
Platz löst.
Eingabe : Baum T1 und T2 .
Ausgabe: δ (T1 , T2 ).
/* treeDist[1..|V (T1 )|,1..|V (T2 )|] ist die permanente
Distanzmatrix
*/
/* ----------------- Vorbereitungsphase ----------------- */
1:
berechne l(), K(T1 )[] und K(T2 )[]
/* ------------------- Hauptschleife -------------------- */
6:
for i := 1 to |K(T1 )| do
for j := 1 to |K(T2 )| do
v := K(T1 )[i],
w := K(T2 )[ j],
call compute_delta(v, w).
7:
print "Edit-Distanz ist treeDist[v, w]".
2:
3:
4:
5:
Algorithmus 4.2: Zhang-Shasha-Algorithmus
Satz 4.3
Der Zhang-Shasha-Algorithmus berechnet die Kosten einer optimalen Edit-DistanzAbbildung zweier Bäume korrekt.
Beweis:
Die Funktion compute_delta(v, w) berechnet die Edit-Distanz zweier spezieller Bäume T1 und T2 mit den Wurzeln v ∈ K(T1 ), w ∈ K(T2 ) und wird für alle Schlüsselknoten
v, w entsprechend ihrer Position in Postordnung von unten nach oben aufgerufen. Für
Schlüsselknoten v1 , v2 ∈ K(T1 ) und w1 , w2 ∈ K(T2 ) mit v1 + w1 < v2 + w2 bedeutet das, dass
compute_delta(v1 , w1 ) vor compute_delta(v2 , w2 ) aufgerufen wird. Da beim Aufruf von compute_delta(v1 , w1 ) die Edit-Distanzen aller Präfixe von T1 (v1 ) und T2 (w1 )
berechnet werden, sind vor dem Aufruf von compute_delta(v2 , w2 ) auch alle Werte
treeDist[i, j] für l(v2 ) ≤ i ≤ v2 und l(w2 ) ≤ j ≤ w2 mit l(v2 ) 6= l(i) oder l(w2 ) 6= l( j) vorhanden. Danach werden im ersten if-Teil der Funktion compute_delta die fehlenden
Werte treeDist[i, j] mit l(v2 ) = l(i) und l(w2 ) = l( j) bestimmt. Nach dem Aufruf von
compute_delta(v2 , w2 ) sind schließlich alle Werte treeDist[i, j] für l(v2 ) ≤ i ≤ v2
und l(w2 ) ≤ j ≤ w2 verfügbar.
Da beim Zhang-Shasha-Algorithmus nicht alle Teilprobleme berechnet werden müssen,
taucht ein bestimmter Knoten im Baum eines zu lösenden Teilproblems in allen Berechnungen insgesamt weniger Male als seine Tiefe auf. Um die Komplexität des Algorithmus angeben zu können, definierten Zhang und Shasha die sogenannte kollabierte Tiefe
(engl. collapsed depth) eines Knotens v ∈ V (T ). Die kollabierte Tiefe von v gibt die Anzahl seiner Vorfahren an, die gleichzeitig Schlüsselknoten von T sind. Formal definiert
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
35
man kollabierte Tiefe als:
cdepth(v) = | anc(v) ∩ K(T )|.
Die kollabierte Tiefe eines Baumes T wird wie folgt definiert:
cdepth(T ) = max{cdepth(v) | v ∈ T }.
Durch folgenden Satz kann die obere Schranke der kollabierten Tiefe eines Baumes
abgeschätzt werden.
Satz 4.4
cdepth(T ) ≤ min{depth(T ), L(T )}.
Beweis:
Es gelten folgende Abschätzungen:
cdepth(v) ≤ depth(v) ≤ depth(T )
(4.1)
cdepth(v) ≤ |K(T )| = |L(T )|, für alle v ∈ T.
(4.2)
und mit Satz 4.2
Aus (4.1) und (4.2) folgt:
cdepth(v) ≤ min{depth(T ), L(T )}, für alle v ∈ T.
Also gilt:
cdepth(T ) ≤ min{depth(T ), L(T )}.
Um die Edit-Distanzen zweier Bäume T1 und T2 zu bestimmen, berechnet der ZhangShasha-Algorithmus die Edit-Distanzen zwischen allen relevanten Teilstrukturen von T1
und T2 . Die relevanten Teilstrukturen eines Baumes T bestehen aus den Präfixen von
allen speziellen Teilbäumen von T . Die Anzahl aller Präfixe eines speziellen Teilbaumes
T(v) ist gleich |T(v)|. Der nächste Satz gibt die Anzahl aller relevanten Teilstrukturen
von T durch die kollabierte Tiefe der Knoten von T an.
Satz 4.5
∑
v∈K(T )
|T (v)| =
∑
cdepth(w)
w∈V (T )
Beweis:
Die linke Summe der Gleichung läuft über alle Schlüsselknoten des Baumes T . Dabei
werden für jeden Teilbaum von T mit einem Schlüsselknoten v als Wurzel alle Knoten w
summiert, für die dieser Schlüsselknoten ein Vorgänger ist. Insgesamt wird ein Knoten w
in der linken Summe soviel Mal gezählt, wie er Schlüsselknoten hat, die seine Vorfahren
sind. Das entspricht nach der Definition genau der kollabierten Tiefe cdepth(w).
36
Approximative Suche in Baumstrukturen
Satz 4.6
Die Berechnung der Edit-Distanz zweier geordneter beschrifteter Bäume T1 , T2
mit dem Zhang-Shasha-Algorithmus benötigt O(|T1 | · |T2 | · min{depth(T1 ), L(T1 )} ·
min{depth(T2 ), L(T2 )}) Zeiteinheiten und O(|T1 | · |T2 |) Speicherplatz.
Beweis:
Im Algorithmus wird die Baum-Edit-Distanz getrennt von der Wald-Edit-Distanz gespeichert. Die Baum-Edit-Distanz δ (T1 (v), T2 (w)) wird für jedes v ∈ T1 und w ∈ T2 , sobald sie berechnet ist, in einem zweidimensionalen Feld treeDist der Größe |T1 | · |T2 |
permanent während der gesamten Ausführung des Algorithmus gespeichert. Dagegen
wird die Wald-Edit-Distanz δ (T1 [l(v)..i], T2 [l(w).. j]) für jedes i ∈ {l(v) − 1, . . . , v} und j ∈
{l(w) − 1, . . . , w} nur temporär in einem zweidimensionalen Feld forestDist der Größe (|T1 | + 1) · (|T2 | + 1) während einer Ausführung der Hauptschleife des Algorithmus gespeichert. Das Feld forestDist wird in jedem Aufruf der Funktion compute_delta
wiederbenutzt. Insgesamt benötigt der Algorithmus also O(|T1 | · |T2 |) Speicherplatz.
Die Vorbereitungsphase des Algorithmus nimmt für die Berechnung von K(T1 ), K(T2 )
und l(v) für alle v ∈ V (T1 ), v ∈ V (T2 ) eine lineare Zeit in Anspruch. Die Funktion
compute_delta berechnet in der Hauptschleife die Edit-Distanz δ (T1 (v), T2 (w)) für
alle v ∈ K(T1 ), w ∈ K(T2 ) und benötigt für eine ihrer Ausführungen O(|T1 (v)| · |T2 (w)|)
Zeiteinheiten. Infolgedessen wird compute_delta für alle speziellen Bäume von T1
und T2 ausgeführt und braucht insgesamt folgende Zeit:
∑
∑
O(|T1 (v)| · |T2 (w)|) = O(
v∈K(T1 ) w∈K(T2 )
∑
|T1 (v)| ·
v∈K(T1 )
∑
|T2 (w)|).
w∈K(T2 )
Aus der obigen Gleichung und Satz 4.5 folgt schließlich:
O(
∑
v∈K(T1 )
|T1 (v)| ·
∑
w∈K(T2 )
|T2 (w)|) = O(
∑
v∈V (T1 )
cdepth(v) ·
∑
cdepth(w))
w∈V (T2 )
≤ O(|T1 | · |T2 | · cdepth(T1 ) · cdepth(T2 )).
Unter Anwendung des Satzes 4.4 ergibt sich die Laufzeitkomplexität zu:
O(|T1 | · |T2 | · min{depth(T1 ), |L(T1 )|} · min{depth(T2 ), |L(T2 )|}).
Der Zhang-Shasha-Algorithmus berechnet nur die Edit-Distanz zweier Bäume.Um
eine optimale Edit-Distanz-Abbildung in derselben Zeit- und Speicherkomplexität zu bestimmen, muss man am Ende des Algorithmus, ausgehend vom Eintrag
forestDist[|T1 |, |T2 |] zurück zum Eintrag forestDist[0, 0] den Weg des jeweils
gefundenen Minimums folgen. Die Vorgehensweise ist ähnlich dem in [WF74] für
Zeichenketten und wird hier deswegen nicht angegeben.
Der Zhang-Shasha-Algorithmus besitzt noch eine weitere interessante Eigenschaft. Er
stellt eine Verallgemeinerung des Wagner-Fischer-Algorithmus [WF74] dar, der die EditDistanz zweier Zeichenketten berechnet. Somit überträgt er das Verfahren, zur Berechnung einer Edit-Distanz, vom eindimensionalen Fall der Zeichenketten auf den mehrdimensionalen Fall der Bäume in einer vergleichbaren algorithmischen Weise und behält für eindimensionale Eingaben dieselbe Zeit- und Speicherkomplexität. Da eine
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
37
Zeichenkette durch einen Baum repräsentiert werden kann, wo jeder Knoten außer
der Wurzel genau einen Vaterknoten besitzt, ergeben sich die Mengen der Schlüsselknoten beider Eingabebäume T1 , T2 beim Zhang-Shasha-Algorithmus zu K(T1 ) = {|T1 |}
und K(T2 ) = {|T2 |}. In diesem Fall hat die Hauptschleife des Zhang-Shasha-Algorithmus
genau eine Iteration. Außerdem ist hierbei der Knoten mit der Nummerierung eins,
in beiden Eingabebäumen, der Knoten mit der kleinsten Nummerierung und damit
l(v) = l(w) = 1 für alle v ∈ V (T1 ), w ∈ V (T2 ). Infolgedessen muss in der Funktion
compute_delta immer nur der erste Teil der if-Abfrage für die Bedingung l(i) = l(v)
und l( j) = l(w) behandelt werden, da es niemals l(i) 6= l(v) oder l( j) 6= l(w) gilt. Setzt
man jetzt in der Hauptschleife des Zhang-Shasha-Algorithmus v = |T1 |, w = |T2 | und in
der Funktion compute_delta l(v) = l(w) = 1, verschwindet die Hauptschleife und der
Fall l(i) 6= l(v) oder l( j) 6= l(w), so dass exakt der Wagner-Fischer-Algorithmus entsteht.
(vgl. Algorithmus 4.3 und [WF74])
Eingabe : Baum T1 und T2 mit |L(T1 )| = 1 und |L(T2 )| = 1.
Ausgabe: δ (T1 , T2 ).
/* treeDist[1..|V (T1 )|,1..|V (T2 )|] ist die permanente
Distanzmatrix
1:
2:
3:
4:
5:
6:
7:
8:
*/
treeDist[0, 0] := 0.
for i := 1 to |T1 | do
treeDist[i, 0] = forestDist[i − 1, 0] + γ(T1 [i], −).
for j := 1 to |T2 | do
treeDist[0, j] = forestDist[0, j − 1] + γ(−, T2 [ j]).
for i := 1 to |T1 | do
for j := 1 to |T2 | do 

treeDist[i − 1, j] + γ(T1 [i], −);
treeDist[i, j] := min treeDist[i, j − 1] + γ(−, T2 [ j]);


treeDist[i − 1, j − 1] + γ(T1 [i], T2 [ j]).
print "Edit-Distanz ist treeDist[|T1 |, |T2 |]".
Algorithmus 4.3: Zhang-Shasha-Algorithmus für Eingaben T1 , T2 mit |L(T1 )| = 1
und |L(T2 )| = 1.
4.2 Klein-Algorithmus
Der Zhang-Shasha-Algorithmus kann als ein Zerlegungsalgorithmus angesehen werden,
da er zur Berechnung der Edit-Distanz seine Eingabebäume in Teilbäume und deren
Präfixe zerlegt. Dabei hängt die Anzahl der gemachten Zerlegungen von der Form beider Eingabebäume ab und kann von Fall zu Fall stark variieren. Um diesen Prozess zu
verdeutlichen, betrachte die Berechnungsvorschrift für den Zhang-Shasha-Algorithmus
nach Satz 4.1 zur Bestimmung der Edit-Distanz zwischen zwei Bäumen T1 (v) und T2 (w)
38
Approximative Suche in Baumstrukturen
mit den Wurzeln v ∈ V (T1 ) und w ∈ V (T2 ). Bezeichne im Folgenden T1 (F1 (v)) = T1 (v) und
T2 (F2 (w)) = T2 (w). Diese Schreibweise soll den rekursiven Aufbau eines Baumes hervorheben und bedeutet, dass die Wurzeln v, w der jeweiligen Bäume entsprechend mit den
Teilwäldern F1 (v) und F2 (w) verbunden sind, die wiederum aus Teilbäumen aufgebaut
sind. Dann gilt:


δ (F1 (v), T2 (F2 (w))) + γ(T1 [v], −),
δ (T1 (F1 (v)), T2 (F2 (w))) = min δ (T1 (F1 (v)), F2 (w)) + γ(−, T2 [w]),
(4.3)


δ (F1 (v), F2 (w)) + γ(T1 [v], T2 [w]).
Jetzt kann auch eine Berechnungsvorschrift für Wälder nach Satz 4.1 abgeleitet werden.
Dabei bezeichnet Wk ◦ Tk (Fk (v)) einen Wald, der in der Reihenfolge von links nach rechts
aus dem Wald Wk und dem Teilbaum Tk (Fk (v)) für k ∈ {1, 2}, v ∈ Tk besteht.


δ (W1 ◦ F1 (v),W2 ◦ T2 (F2 (w))) + γ(T1 [v], −),
δ (W1 ◦ T1 (F1 (v)),W2 ◦ T2 (F2 (w))) = min δ (W1 ◦ T1 (F1 (v)),W2 ◦ F2 (w)) + γ(−, T2 [w]),


δ (W1 ,W2 ) + δ (T1 (F1 (v)), T2 (F2 (w))).
(4.4)
Daraus erkennt man, dass der Zhang-Shasha-Algorithmus die Teilwälder von T1 und T2
in kleinere Teilwälder zerlegt, deren rechteste Wurzeln links von den rechtesten Wurzeln der ursprünglichen Teilwälder liegen. Man nennt daher die in den Rekursionen
auftauchenden Teilwälder die linkesten Teilwälder. Da aber hier immer nur der rechteste
Teilbaum zerlegt wird, bezeichnet man diesen Vorgang als rechte Zerlegung. In einigen
Situationen kann es jedoch sinnvoller sein, eine andere Zerlegung der Teilwälder zu
wählen, um die Anzahl der rekursiven Aufrufe zu verringern. Eine andere Möglichkeit
die Teilwälder der Eingabebäume zu zerlegen, stellt die linke Zerlegung dar. Hierbei
werden bei den rekursiven Aufrufen die Teilwälder in rechteste Teilwälder zerlegt. Folgende Gleichung gibt die linke Zerlegung an.


δ (F1 (v) ◦W1 , T2 (F2 (w)) ◦W2 ) + γ(T1 [v], −),
δ (T1 (F1 (v)) ◦W1 , T2 (F2 (w)) ◦W2 ) = min δ (T1 (F1 (v)) ◦W1 , F2 (w) ◦W2 ) + γ(−, T2 [w]),


δ (W1 ,W2 ) + δ (T1 (F1 (v)), T2 (F2 (w))).
(4.5)
Um die linke Zerlegung algorithmisch zu bewerkstelligen, muss bei dem ZhangShasha-Algorithmus zu Beginn die Nummerierung der Knoten anhand der PostordnungTraversierung von rechts nach links, anstatt wie bisher von links nach rechts, festgelegt
werden. Anschließend braucht man nur l(v) durch r(v) zu ersetzen, das den rechtesten
Blatt im Teilbaum T (v) liefert und die Menge der Schlüsselknoten
K(T ) = {root(T )} ∪ {v ∈ V (T ) | v hat ein echtes rechtes Geschwister}
entsprechend in der Vorbereitungsphase zu berechnen. Hierbei werden die Bäume T1
und T2 in rechteste Pfade zerlegt.
39
Kapitel 4. Verfahren zur Berechnung der Baum-Edit-Distanz
Im Falle der rechten bzw. der linken Zerlegung kommen bei den rekursiven Aufrufen alle
Teilbäume von T1 und T2 sowie deren Präfixe bzw. Suffixe vor. Da jedes Teilbaum T (v)
genau |T (v)| nicht leere Präfixe und Suffixe hat, ist die Anzahl der rekursiven Aufrufe
sowohl bei der rechten als auch der linken Zerlegung für einen Baum T durch
∑
O(|T (v)|) ≤ O(|T |2 )
v∈V (T )
beschränkt.
Falls also die beiden Eingabebäume T1 und T2 , mit |T1 | = |T2 | = n die gleiche Anzahl
von Knoten haben und die Anzahl der Aufrufe von der Funktion compute_delta O(n)
beträgt, benötigt der Zhang-Shasha-Algorithmus im schlechtesten Fall zu Berechnung
ihrer Edit-Distanz O(n4 ) Zeiteinheiten.
Der von Klein [Kle98] angegebene Algorithmus zur Berechnung der Edit-Distanz zweier
Bäume verfolgt einen anderen Weg und wechselt bei jedem rekursiven Aufruf für den
ersten Eingabebaum T1 die Richtung der Zerlegung seiner Teilwälder anhand von sogenannten schweren Pfaden. Die Zerlegung von Bäumen in schwere Pfade wurde erstmals
von Harel und Tarjan eingeführt [HT84]. Folgende Definition gibt einen schweren Pfad
formal an.
Definition 4.2 (Schwerer Pfad)
Sei T ein gewurzelter Baum. Definiere das Gewicht eines Knotens v ∈ V (T ) als die Größe
|T (v)|. Falls v ∈
/ L(T ), so bezeichne heavy(v) ein Kind von v mit dem größten Gewicht, wobei
es hier mehrere Kinder mit demselben Gewicht zur Auswahl geben kann. Falls v ∈ L(T ), so
ist heavy(v) = v. Die Folge von Knoten
v, heavy(v), heavy(heavy(v)), . . .
definiert einen absteigenden schweren Pfad von T (v).
Die Abbildung 4.3 zeigt ein Beispiel einer Zerlegung eines Baumes in schwere Pfade.
Der Klein-Algorithmus kann im Allgemeinen durch folgende vier Schritte beschrieben
werden:
0
0
(1) Sei δ (T1 (F1 (v)) ◦W1 , F2 ) ein zu berechnendes Teilproblem, wobei F2 irgendein Teilwald von T2 ist.
(2) Berechne den schweren Pfad P für T1 (F1 (v)) ◦W1 .
(3) Falls v auf dem Pfad P liegt, benutze die rechte Zerlegung nach Gleichung 4.4,
andererseits die linke Zerlegung nach Gleichung 4.5.
(4) Wende diese Berechnungsvorschrift rekursiv auf Teilwälder von T1 (F1 (v)) ◦W1 an.
Die Zerlegung eines Baumes T in schwere Pfade hat den Vorteil, dass dann die kollabierte Tiefe cdepth(v) für alle v ∈ V (T ) durch O(log(|T |)) beschränkt ist (vgl. [ST81]).
40
Approximative Suche in Baumstrukturen
Abbildung 4.3: Zerlegung eines Baumes in schwere Pfade. Schwere Pfade
sind fett abgedruckt. Gefüllte Knoten stellen Schlüsselknoten
des Baumes dar.
In diesem Fall werden für den ersten Baum höchstens O(|T1 | · log(|T1 |)) rekursive Aufrufe generiert2 , so dass der Klein-Algorithmus im schlechtesten Fall nur O(n3 · log(n))
Zeiteinheiten für seine Berechnungen benötigt.
Satz 4.7
Die Berechnung der Edit-Distanz zweier Bäume T1 , T2 mit dem Klein-Algorithmus benötigt
O(|T1 |2 · |T2 | · log(|T2 |)) Zeiteinheiten und Speicherplatz [Kle98].
Damit reduziert der Klein-Algorithmus die Laufzeit des Zhang-Shasha-Algorithmus im
schlechtesten Fall von O(n4 ) auf O(n3 · log(n)). Im mittleren Fall aber läuft der ZhangShasha-Algorithmus immer noch schneller als der Klein-Algorithmus, da er dafür laut
3
3
Dulucq und Tichit [DT03] O(|T1 | 2 · |T2 | 2 ) Zeiteinheiten benötigt und somit für Bäume
gleicher Größe seine gesamten Berechnungen im Durchschnitt in O(n3 ) Zeiteinheiten
ausführt.
2 Für
den zweiten Baum müssen jedoch O(|T2 |2 ) rekursive Aufrufe ausgeführt werden.
Kapitel 5. Verfahren zur Berechnung der Baum-Alignment-Distanz
41
5 Verfahren zur Berechnung der
Baum-Alignment-Distanz
In diesem Kapitel wird der Jiang-Wang-Zhang-Algorithmus [JWZ95] vorgestellt, der die
Alignment-Distanz zwischen zwei geordneten Bäumen berechnet. Er basiert auf den
folgenden zwei Sätzen, die die Berechnung der Alignment-Distanz zwischen Bäumen
bzw. Wäldern rekursiv ausdrücken und eine Implementierung des Algorithmus nach
den dynamischen Programmiermethoden ermöglichen.
Zunächst sollen aus Gründen der Übersichtlichkeit einige Abkürzungen vorgenommen
werden. Ist Tk (k ∈ N) ein geordneter Baum und hat ein Knoten v ∈ V (Tk ) mit dem
Grad deg(v) = i die Kinder v1 , . . . , vi , so bezeichnet Fk (vs , vt ) für 1 ≤ s ≤ t ≤ i einen Wald
bestehend aus den Bäumen Tk (vs ), . . . , Tk (vt ). Weiterhin wird vereinfachend Fk (v1 , vi ) =
Fk (v)1 gesetzt.
Satz 5.1
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Sei v ∈ V (T1 ) und v1 , . . . , vi die Folge seiner Kinder. Sei w ∈ V (T2 )
und w1 , . . . , w j die Folge seiner Kinder. Dann gilt:
(1) α(θ , θ ) = 0,
(2) α(T1 (v), θ ) = α(F1 (v), θ ) + γ(T1 [v], −),
(3) α(θ , T2 (w)) = α(θ , F2 (w)) + γ(−, T2 [w]),
i
(4) α(F1 (v), θ ) = ∑ α(T1 (vk ), θ ),
k=1
j
(5) α(θ , F2 (w)) = ∑ α(θ , T2 (wk )),
k=1


α(T1 (v), θ ) + min {α(T1 (vk ), T2 (w)) − α(T1 (vk ), θ )},


1≤k≤i

(6) α(T1 (v), T2 (w)) = min α(θ , T2 (w)) + min {α(T1 (v), T2 (wk )) − α(θ , T2 (wk ))},

1≤k≤ j


α(F (v), F (w)) + γ(T [v], T [w]).
1
2
1
2
Beweis:
Die erste Gleichung ist trivial, da leere Bäume nicht ausgerichtet werden müssen. In der
zweiten Gleichung wird der erste Baum T1 (v) gegen einen leeren Baum ausgerichtet, so
1 Liegt
eine Postordnung der Knoten von Tk vor, so ist Tk [l(v)..v − 1] = Fk (v).
42
Approximative Suche in Baumstrukturen
dass nach der Ausrichtung der leere Baum nur aus den Blank-Symbolen besteht und die
Struktur des ersten Baumes T1 (v) annimmt. In der dritten Gleichung wird analog der
zweite Baum T2 (w) gegen einen leeren Baum ausgerichtet. Die Gleichungen (4) und (5)
sind ebenfalls trivial, da dort Wälder gegen leere Wälder ausgerichtet werden. Im sechsten Fall wird eine optimale Ausrichtung A von T1 (v) und T2 (w) betrachtet. Dabei ergeben
sich für die Wurzeln v, w der Bäume T1 (v) und T2 (w) insgesamt vier Möglichkeiten, wie
ihre Symbole in Knoten von A als Paare zusammensetzt werden können:
(1) Das Paar (T1 [v], T2 [w]) ist eine Beschriftung in A. Dann muss die Wurzel von A mit
dem Paar (T1 [v], T2 [w]) beschriftet sein. Also,
α(T1 (v), T2 (w)) = α(F1 (v), F2 (w)) + γ(T1 [v], T2 [w]).
(2) Die Paare (T1 [v], −) und (T1 [m], T2 [w]) sind Beschriftungen in A für irgendein m ∈
V (T1 (v)). Dann muss die Wurzel von A mit dem Paar (T1 [v], −) beschriftet sein. In
diesem Fall ist m ∈ V (T1 (vk )) für irgendein 1 ≤ k ≤ i. Folglich,
α(T1 (v), T2 (w)) = α(T1 (v), θ ) + min {α(T1 (vk ), T2 (w)) − α(T1 (vk ), θ )}.
1≤k≤i
(3) Die Paare (−, T2 [w]) und (T1 [v], T2 [n]) sind Beschriftungen in A für irgendein n ∈
V (T2 (w)). Dann muss die Wurzel von A mit dem Paar (−, T2 [w]) beschriftet sein. In
diesem Fall ist n ∈ V (T2 (wk )) für irgendein 1 ≤ k ≤ j. Folglich,
α(T1 (v), T2 (w)) = α(θ , T2 (w)) + min {α(T1 (v), T2 (wk )) − α(θ , T2 (wk ))}.
1≤k≤ j
(4) Die Paare (T1 [v], −) und (−, T2 [w]) sind Beschriftungen in A. Entfernt man die
zwei Knoten mit diesen Beschriftungen und fügt stattdessen einen Knoten mit
der Beschriftung (T1 [v], T [w]) in A ein, entsteht eine neue Ausrichtung von
T1 (v) und T2 (w), dessen Kosten aufgrund der Dreiecksungleichung γ(T[ v], T [w]) ≤
γ(T1 [v], −) + γ(−, T2 [w]) kleiner oder gleich sind als die der ursprünglichen Ausrichtung. Aus diesem Grund sind die Kosten dieses Falles kleiner oder gleich der
Kosten im Fall (1), so dass der Fall (4) nicht getrennt behandelt werden muss.
Das Minimum aller betrachteten Fälle liefert schließlich die Gleichung (6).
Da die Baum-Alignment-Distanz α(T1 (v), T2 (w)) in der Rekursionsformel (6) von der
Wald-Alignment-Distanz α(F1 (v), F2 (w)) abhängt, ist ein weiterer Satz notwendig, der
eine Berechnungsvorschrift für die Alignment-Distanz zwischen den Wäldern angibt.
Satz 5.2
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Sei v ∈ V (T1 ) und v1 , . . . , vi die Folge seiner Kinder. Sei w ∈ V (T2 )
Kapitel 5. Verfahren zur Berechnung der Baum-Alignment-Distanz
43
und w1 , . . . , w j die Folge seiner Kinder. Dann gilt für alle s,t mit 1 ≤ s ≤ i und 1 ≤ t ≤ j:


α(F1 (v1 , vs−1 ), F2 (w1 , wt )) + α(T1 (vs ), θ ),



α(F1 (v1 , vs ), F2 (w1 , wt−1 )) + α(θ , T2 (wt )),





α(F1 (v1 , vs−1 ), F2 (w1 , wt−1 )) + α(T1 (vs ), T2 (wt )),



min {α(F1 (v1 , vk−1 ), F2 (w1 , wt−1 ))
α(F1 (v1 , vs ), F2 (w1 , wt )) = min 1≤k<s



+α(F1 (vk , vs ), F2 (wt ))} + γ(−, T2 [wt ]),





min {α(F1 (v1 , vs−1 ), F2 (w1 , wk−1 ))


1≤k<t



+α(F1 (vs ), F2 (wk , wt ))} + γ(T1 [vs ], −).
Beweis:
Betrachte eine optimale Ausrichtung A von Wäldern F1 (v1 , vs ) und F2 (w1 , wt ). Es gibt
insgesamt drei Möglichkeiten wie das Paar der rechtesten Wurzel in A aus den Symbolen
der Wurzeln vs und wt zusammengesetzt sein könnte:
(1) Das Paar ist (T1 [vs ], T2 [wt ]). Dann muss der rechteste Baum in A eine optimale Ausrichtung von Bäumen T (vs ) und T (wt ) sein. Folglich,
α(F1 (v1 , vs ), F2 (w1 , wt )) = α(F1 (v1 , vs−1 ), F2 (w1 , wt−1 )) + α(T1 (vs ), T2 (wt )).
(2) Das Paar ist (T1 [vs ], −). In diesem Fall existiert ein k mit 1 ≤ k ≤ t + 1, so dass der
rechteste Baum T1 (vs ) in A mit dem Teilwald F2 (wk , wt ) ausgerichtet ist. Hierbei
sind drei Unterfälle zu berücksichtigen:
(a) (k = t + 1) : Dann ist T1 (vs ) mit F2 (wt+1 , wt ) = θ ausgerichtet und es folgt,
α(F1 (v1 , vs ), F2 (w1 , wt )) = α(F1 (v1 , vs−1 ), F2 (w1 , wt )) + α(T1 (vs ), θ ).
(b) (k = t) : Dann ist T1 (vs ) mit F2 (wt , wt ) = T2 (wt ) ausgerichtet und es folgt
Fall (1).
(c) (1 ≤ k < t) : Dann ist T1 (vs ) mit einem solchen Wald F2 (wk , wt ) ausgerichtet,
der in A enthalten ist. Also,
α(F1 (v1 , vs ), F2 (w1 , wt )) = min {α(F1 (v1 , vs−1 ), F2 (w1 , wk−1 ))
1≤k<t
+ α(F1 (vs ), F2 (wk , wt ))}
+ γ(T1 [vs ], −).
(3) Das Paar ist (−, T2 [wt ]). Symmetrisch zu Fall (2).
Das Minimum aller betrachteten Fälle liefert schließlich die gesuchte Gleichung.
Um die Alignment-Distanz α(T1 (v), T2 (w)) mit dem Satz 5.1 in einer konstanten
Zeit bestimmen zu können, ist es zunächst erforderlich alle Alignment-Distanzen
α(T1 (m), T2 (n)) für m ≤ v und n ≤ w mit m + n < v + w vorher zu berechnen. Es bietet sich
44
Approximative Suche in Baumstrukturen
daher an, die Rekursionen in einer Bottom-up-Manier mittels dynamischer Programmierung zu implementieren. Weiterhin muss zur Bestimmung von α(T1 (v), T2 (w)) die
Wald-Alignment-Distanz α(F1 (v), F2 (w)) berechnet werden. Um sie in einer konstanten
Zeit bestimmen zu können, müssen nach dem Satz 5.2 folgende Alignment-Dsitanzen
bereits berechnet sein:
(1) α(F1 (v), F2 (w1 , w j−1 )), α(F1 (v1 , vi−1 ), F2 (w))
und α(F1 (v1 , v p ), F2 (w1 , wq )), für 0 ≤ p < i, 0 ≤ q < j,
(2) α(F1 (v p ), F2 (wk , wq )), für 1 ≤ p ≤ i, 1 ≤ k ≤ q ≤ j,
(3) α(F1 (vk , v p ), F2 (wq )), für 1 ≤ k ≤ p ≤ i, 1 ≤ q ≤ j.
Es müssen also für jedes Paar von Teilbäumen T1 (v) und T2 (w) auch die AlignmentDistanzen α(F1 (v), F2 (ws , wt )) für alle 1 ≤ s ≤ t ≤ j und α(F1 (vs , vt ), F2 (w)) für alle
1 ≤ s ≤ t ≤ i berechnet werden. Das bedeutet, dass F1 (v) mit allen Teilwäldern von F2 (w)
und umgekehrt F2 (w) mit allen Teilwäldern von F1 (v) ausgerichtet werden muss. Dazu verwendet der Jiang-Wang-Zhang-Algorithmus die Funktion compute_alpha, die
mit den Parametern vs , vi ∈ F1 (v) und wt , w j ∈ F2 (w) aufgerufen wird, und für ein bestimmtes s mit 1 ≤ s ≤ i und ein bestimmtes t mit 1 ≤ t ≤ j die Menge der AlignmentDistanzen As,t = {α(F1 (vs , v p ), F2 (wt , wq )) | s ≤ p ≤ i,t ≤ q ≤ j} berechnet. Infolgedessen
wird compute_alpha im Laufe des Algorithmus zur Bestimmung der Mengen As,1
und A1,t für alle 1 ≤ s ≤ i und 1 ≤ t ≤ j aufgerufen. Unter Annahme, dass alle Werte
α(F1 (v p ), F2 (wk , wq )) für 1 ≤ p ≤ i und 1 ≤ k ≤ q ≤ j, und alle α(F1 (vk , v p ), F2 (wq )) für
1 ≤ k ≤ p ≤ i und 1 ≤ q ≤ j bereits vorliegen, wird die Funktion compute_alpha ebenfalls bottom-up unter Ausnutzung dynamischer Programmierung nach den Rekursionen
des Satzes 5.2 konstruiert.
Eingabe : Knoten vs , vi ∈ F1 (v) und wt , w j ∈ F2 (w).
Ausgabe: {α(F1 (vs , v p ), F2 (wt , wq )) | s ≤ p ≤ i und t ≤ q ≤ j}.
1:
2:
3:
4:
5:
6:
7:
8:
α(F1 (vs , vs−1 ), F2 (wt , wt−1 )) := 0
for p := s to i do
α(F1 (vs , v p ), F2 (wt , wt−1 )) := α(F1 (vs , v p−1 ), F2 (wt , wt−1 )) + α(T1 (v p ), θ )
for q := t to j do
α(F1 (vs , vs−1 ), F2 (wt , wq )) := α(F1 (vs , vs−1 ), F2 (wt , wq−1 )) + α(θ , T2 (wq ))
for p := s to i do
for q := t to j do
Berechne α(F1 (vs , v p ), F2 (wt , wq )) unter Anwendung des Satzes 5.2.
Funktion compute_alpha(vs , vi , wt , w j )
Der Algorithmus 5.2 zeigt den Jiang-Wang-Zhang-Algorithmus übersichtlich in
einer allgemeinen Form, die verschiedene Implementierungen bezüglich der
Speichereffizienz erlaubt. Eine konkrete von mir in dieser Arbeit mit Programmiersprache Java umgesetzte Implementierung des Jiang-Wang-ZhangAlgorithmus kann im Quelltext auf der beiliegenden CD eingesehen werden.
45
Kapitel 5. Verfahren zur Berechnung der Baum-Alignment-Distanz
Eingabe : Baum T1 und T2 .
Ausgabe: α(T1 , T2 ).
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
α(θ , θ ) := 0
for v := 1 to |T1 | do
α(F1 (v), θ ) := ∑ik=1 α(T1 (vk ), θ )
α(T1 (v), θ ) := α(F1 (v), θ ) + γ(T1 [v], −)
for w := 1 to |T2 | do
j
α(θ , F2 (w)) := ∑k=1 α(θ , T2 (wk ))
α(θ , T2 (w)) := α(θ , F2 (w)) + γ(−, T2 [w])
for v := 1 to |T1 | do
for w := 1 to |T2 | do
/* Richte F2 (w) mit allen Teilwäldern von F1 (v) aus.
for s := 1 to i do
/* Aufruf der Funktion compute_alpha für
/* F1 (vs , vi ) und F2 (w).
call compute_alpha (vs , vi , w1 , w j ).
/* Richte F1 (v) mit allen Teilwäldern von F2 (w) aus.
for t := 1 to j do
/* Aufruf der Funktion compute_alpha für
/* F1 (v) und F2 (wt , w j ).
call compute_alpha (v1 , vi , wt , w j ).

α(T1 (v), θ )





+ min {α(T1 (vk ), T2 (w)) − α(T1 (vk ), θ )};


1≤k≤i

α(T1 (v), T2 (w)) := min α(θ , T2 (w))



min {α(T1 (v), T2 (wk )) − α(θ , T2 (wk ))};


1≤k≤ j



α(F1 (v), F2 (w)) + γ(T1 [v], T2 [w]).
*/
*/
*/
*/
*/
*/
print "Alignment-Distanz ist α(T1 (|T1 |), T2 (|T2 |))".
Algorithmus 5.2: Jiang-Wang-Zhang-Algorithmus
Satz 5.3
Die Berechnung der Alignment-Distanz zweier geordneter beschrifteter Bäume T1 , T2 mit
dem Jiang-Wang-Zhang-Algorithmus benötigt O(|T1 | · |T2 | · ((deg(T1 ) + deg(T2 ))2 ) Zeiteinheiten.
Beweis:
Für eine Eingabe vs , vi ∈ F1 (v) und wt , w j ∈ F2 (w) benötigt die Funktion compute_alpha
˙ − s + j − t)) = O(i · j · (i + j)). Somit braucht der Algorithmus,
die Zeit O((i − s) · ( j − t)(i
für ein Paar v und w, O(i · j · (i + j)2 ) Zeit. Dementsprechend braucht der Algorithmus für
46
Approximative Suche in Baumstrukturen
alle Paare von Knoten v und w folgende Zeit:
∑
∑
O(deg(v) · deg(w) · (deg(v) + deg(w))2 )
v∈V (T1 ) w∈V (T2 )
≤
∑
∑
O(deg(v) · deg(w) · (deg(T1 ) + deg(T2 ))2 )
v∈V (T1 ) w∈V (T2 )
≤ O((deg(T1 ) + deg(T2 ))2 ·
∑
deg(v) ·
v∈V (T1 )
≤ O(|T1 | · |T2 | · (deg(T1 ) + deg(T2 ))2 ).
∑
deg(w))
w∈V (T2 )
Der Jiang-Wang-Zhang-Algorithmus berechnet nur die Kosten einer optimalen Ausrichtung. Eine entsprechende optimale Ausrichtung lässt sich aus den berechneten Werten
α(T1 (v), T2 (w)), α(F1 (v), F2 (w)), α(F1 (vs , vt ), F2 (w)) und α(F1 (v), F2 (ws , wt )) in derselben
Zeit- und Speicherkomplexität durch einfache Rückverfolgungstechniken bestimmen.
47
Kapitel 6. Approximative Baumsuche
6 Approximative Baumsuche
6.1 Das approximative Baum-Matching-Problem
In vielen Anwendungsgebieten der Dokumentenverarbeitung und der Bioinformatik
[WS81] geht es darum, eine Zeichenkette oder ein Suchmuster, das sogenannte Pattern, in einem größeren Text möglichst effizient mit Textalgorithmen [CR94] zu finden.
Man interessiert sich dabei z.B. für das Erkennen von Texten, die Schreib- oder Sprachfehler enthalten, oder auch für DNA-Sequenzen, die durch etwaige Mutationen oder
andere Manipulationen verändert wurden. Hierbei ist oft nicht nur ein exaktes Auftreten eines Patterns in einem Text von Interesse, sondern auch Textstellen, wo gewisse
Abweichungen und Übereinstimmungen des Patterns erlaubt sind. Man sucht also bestimmte Stellen im Text, die dem gegebenen Pattern am ähnlichsten sind. Dabei wird
die Ähnlichkeit zwischen Zeichenketten über die Edit-Distanz festgestellt, die in diesem
Fall die minimalen Kosten angibt, eine gefundene Textstelle mit Edit-Operationen in das
gegebene Pattern zu transformieren. Die Bestimmung der minimalen Edit-Distanz unter
allen Edit-Distanzen zwischen einer aufeinanderfolgenden Teilzeichenkette eines Textes und einem gegebenen Pattern führt auf das approximative String-Matching-Problem
hinaus, das im Folgenden formal definiert wird.
Definition 6.1 (Das approximative String-Matching-Problem)
Sei Σ ein Alphabet und t1 ,t2 ∈ Σ∗ zwei Zeichenketten, wobei t1 die Länge |t1 | = n hat. Dann
bezeichnet δ (t1 ,t2 ) die Edit-Distanz zwischen t1 und t2 und
∆ (t1 ,t2 ) = min {δ (t1 [ j..n],t2 )}.
1≤ j≤i+1
Gegeben ist eine Zeichenkette t ∈ Σ∗ und ein Pattern p ∈ Σ∗ . Das approximative StringMatching-Problem besteht darin, für alle 1 ≤ i ≤ |t|, ∆ (t[1..i], p) zu berechnen.
In dem approximativen String-Matching-Problem geht es also darum, für 1 ≤ i ≤ |t| alle
Edit-Distanzen zwischen der Zeichenkette t[1..i] und dem Pattern p zu berechnen, wenn
vorher in t[1..i] ein beliebig langes Präfix kostenfrei entfernt werden kann. Somit lässt
sich durch die Lösung des approximativen String-Matching-Problems eine Teilzeichnekette in einer Zeichenkette t finden, die dem gegeben Pattern p am ähnlichsten ist, wenn
man anschließend aus den berechneten Edit-Distanzen min1≤i≤|t| ∆ (t[1..i], p) bestimmt.
Da eine Zeichenkette durch einen Baum repräsentiert werden kann, in welchem alle
Nicht-Blattknoten genau ein Kind besitzen, ist es sinnvoll das approximative StringMatching-Problem auf Bäume zu erweitern, um damit mehrdimensionale Probleme lösen zu können. In [ZS89] übertragen Zhang und Shasha das Problem von Zeichenketten
48
Approximative Suche in Baumstrukturen
auf Bäume, indem sie statt den Präfixen von Zeichenketten, eine Menge von Teilbäumen
bzw. Teilwäldern aus einem gegebenen Baum entfernen. Dazu führen sie zwei folgende
neue Edit-Operationen ein, die kostenfrei auf einem Baum T ausgeführt werden können.
Definition 6.2 (Zusätzliche Edit-Operationen)
Entfernung eines Knotens v in T : Entferne den gesamten Teilbaum T (v), einschließlich v,
und die Kante (v, p(v)) aus T 1 . (siehe Abbildung 6.1a)
Beschneidung eines Knotens v in T : Entferne alle echten Nachfolger von v zusammen mit
allen sie verbindenden Kanten aus T 2 . (siehe Abbildung 6.1b)
Um alle aus einem Baum zu entfernenden Knoten auf einmal bequem über eine Operation angeben zu können, müssen zunächst weitere Begriffe eingeführt werden.
Definition 6.3 (Konsistenz)
Zwei Knoten v und w mit v 6= w heißen konsistent, wenn keiner von ihnen ein Nachfolger
des jeweils anderen ist. D.h. v ist nicht ein Nachfolger von w und w ist nicht ein Nachfolger
von v.
Eine Menge C von Knoten aus T ist konsistent, wenn jede zwei Knoten v, w ∈ C mit v 6= w
konsistent sind. Die Menge aller konsistenten Mengen von Knoten aus T wird als ϒ (T )
bezeichnet.
Des Weiteren werden zwei neue Operation auf Bäumen definiert, die auf den EditOperationen Entfernung und Beschneidung von Knoten beruhen.
Definition 6.4 (Entferne- und Schneide-Operation)
Sei T ein Baum. Für alle C ∈ ϒ (T ) definiere zwei folgende Operationen auf T .
Entferne-Operation : T C bezeichnet den Baum, der aus T nach Entfernung aller Kno-
ten v ∈ C resultiert.
Schneide-Operation : T  C bezeichnet den Baum, der aus T nach Beschneidung aller
Knoten v ∈ C resultiert.
Jetzt kann das approximative Baum-Matching-Problem nach Zhang und Shasha [ZS89]
auf zwei Weisen über die Entferne-Operation oder die Schneide-Operation  definiert
werden.
Definition 6.5 (Das approximative Baum-Matching-Problem)
Seien T1 , T2 zwei Bäume. Definiere
Ψ (T1 , T2 ) = min {δ (T1 C, T2 )}
C∈ϒ (T1 )
1 Wenn
Knoten von T in Postordnung nummeriert sind, wird der komplette Teilbaum T [l(v)..v] entfernt.
Knoten von T in Postordnung nummeriert sind, wird der komplette Teilwald T [l(v)..v − 1] entfernt.
2 Wenn
49
Kapitel 6. Approximative Baumsuche
T’
T
9
9
3
1
8
2
6
4
3
7
1
2
5
(a)
T’
T
9
9
3
1
8
2
6
4
3
7
1
8
2
5
(b)
Abbildung 6.1: In Abbildung (a) und (b) sind Beispiele der neuen kostenfreien Edit-Operationen, Entfernung und Beschneidung von Knoten, abgebildet. Der Einfachheit halber sind alle Knoten mit ihrer Nummerierung in Postordnung beschriftet.
(a) Entfernung des Knotens 8.
(b) Beschneidung des Knotens 8.
50
Approximative Suche in Baumstrukturen
und
Φ(T1 , T2 ) = min {δ (T1  C, T2 )}.
C∈ϒ (T1 )
Gegeben ist ein Baum T und ein Baum P („das Pattern“). Das approximative BaumMatching-Problem besteht darin, für alle v ∈ T , Ψ (T (v), P) oder Φ(T (v), P) zu berechnen.
Sind statt zwei Bäumen T, P zwei Wälder F, P gegeben, dann wird die Berechnung,
für alle v ∈ F, von Ψ (F(v), P) und Φ(F(v), P) das approximative Wald-Matching-Problem
bezeichnet.
Der nächste Satz gibt eine rekursive Berechnungsvorschrift zur Lösung des approximativen Baum-Matching-Problems über die Entferne-Operation an. Er zeigt wie sich für
zwei gegebene Bäume T1 und T2 alle Edit-Distanzen zwischen T1 (v) und T2 mit v ∈ T1 berechnen lassen, wenn Null oder mehr Teilbäume vorher mit der Operation aus T1 (v)
ohne Kosten entfernt werden können.
Satz 6.1
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ V (T1 ), w ∈ V (T2 ), i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
Dann gelten folgende Rekursionen:
(1) Ψ (θ , θ ) = 0,
(2) Ψ (T1 [l(v)..i], θ ) = 0,
(3) Ψ (θ , T2 [l(w).. j]) = Ψ (θ , T2 [l(w).. j − 1]) + γ(−, T2 [ j]),

Ψ (T1 [l(v)..l(i) − 1], T2 [l(w).. j]),





Ψ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),



Ψ (T [l(v)..i], T [l(w).. j − 1]) + γ(−, T [ j]),
1
2
2
(4) Ψ (T1 [l(v)..i], T2 [l(w).. j]) = min

Ψ
(T
[l(v)..l(i)
−
1],
T
[l(w)..l(
j)
−
1])
1
2




 +Ψ (T1 [l(i)..i − 1], T2 [l( j).. j − 1])



+γ(T1 [i], T2 [ j]).
Beweis:
Die erste Gleichung ist trivial, da die Kosten einer Edit-Distanz-Abbildung zwischen
zwei leeren Baumstrukturen gleich Null sind. In der zweiten Gleichung können alle
Bäume, aus denen sich der Wald T1 [l(v)..i] zusammensetzt, ohne Kosten mit der Operation entfernt werden, so dass am Ende nur ein leerer Wald übrig bleibt und es
Ψ (T1 [l(v)..i], θ ) = δ (θ , θ ) = 0 gilt. In der dritten Gleichung können keine Knoten des ersten Waldes mehr entfernt werden und es ergibt sich der gleiche Fall des Satzes 3.4 für
die Gleichung (3). Für die vierte Gleichung sei C ∈ ϒ (T1 [l(v)..i]) eine konsistente Menge,
die δ (T1 [l(v)..i] C, T2 [l(w).. j]) derart minimiert, dass es δ (T1 [l(v)..i] C, T2 [l(w).. j]) =
Ψ (T1 [l(v)..i], T2 [l(w).. j]) gilt. Dann gibt es für den Knoten i zwei Möglichkeiten:
(1) i ∈ C : In diesem Fall wird der ganze Teilbaum T (i) in T1 [l(v)..i] ohne Kosten ent-
Kapitel 6. Approximative Baumsuche
51
fernt und es ergibt sich:
Ψ (T1 [l(v)..i], T2 [l(w).. j]) = Ψ (T1 [l(v)..l(i) − 1], T2 [l(w).. j]).
(2) i ∈
/ C : In diesem Fall wird i nicht mit der Operation aus T1 [l(v)..i] entfernt. Betrachte nun eine optimale Edit-Distanz-Abbildung M zwischen T1 [l(v)..i] C und
T2 [l(w).. j]. Hierbei ergeben sich wiederum die gleichen drei Fälle wie in der Gleichung (4) des Satzes 3.4.
Das Minimum aller behandelten Fälle liefert die Gleichung (4).
Genauso wie bei den Rekursionsformeln des Satzes 3.4 zur Berechnung der EditDistanz, lässt sich auch die Gleichung (4) des Satzes 6.1 vereinfachen und in zwei Teile
getrennt für Bäume und Wälder zerlegen.
Satz 6.2
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ V (T1 ), w ∈ V (T2 ), i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
(1) Falls l(i) = l(v) und l( j) = l(w), dann gilt:

Ψ (θ , T2 [l(w).. j]),



Ψ (T [l(v)..i − 1], T [l(w).. j]) + γ(T [i], −),
1
2
1
Ψ (T1 [l(v)..i], T2 [l(w).. j]) = min

Ψ (T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),



Ψ (T1 [l(v)..i − 1], T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
(2) Sonst:


Ψ (T1 [l(v)..l(i) − 1], T2 [l(w).. j]),





Ψ (T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),
Ψ (T1 [l(v)..i], T2 [l(w).. j]) = min Ψ (T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),



Ψ (T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])



 +Ψ (T (i), T ( j)).
1
2
Der Beweis des obigen Satzes ist analog zu Satz 4.1 und wird hier deshalb nicht wiederholt.
Jetzt kann der Zhang-Shasha-Algorithmus umgeändert werden, damit er für zwei gegebene Bäume T1 und T2 , alle Edit-Distanzen zwischen T1 (v) und T2 mit v ∈ T1 berechnet, wenn Null oder mehr Teilbäume aus T1 (v) mit der Operation entfernt werden
können. Dazu muss nur die Funktion compute_delta im Zhang-Shasha-Algorithmus
mit einer neuen Funktion ausgetauscht werden, die die Rekursionsformeln der Sätze
6.1 und 6.2 umsetzt. Hierfür wird die Funktion compute_Psi in derselben Weise wie
52
Approximative Suche in Baumstrukturen
compute_delta mit dynamischer Programmierung in Bottom-Up-Ordnung konstruiert.
Eingabe : Knoten v ∈ V (T1 ) und w ∈ V (T2 ).
Ausgabe: {Ψ (T1 [l(v)..i], T2 [l(w).. j]) | i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}}.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
θ1 := l(v) − 1
θ2 := l(w) − 1
forestDist[θ1 , θ2 ] = 0
for i := l(v) to v do
forestDist[i, θ2 ] = 0
for j := l(w) to w do
forestDist[θ1 , j] = forestDist[θ1 , j − 1] + γ(−, T2 [ j])
for i := l(v) to v do
for j := l(w) to w do
if l(i) = l(v) and l( j) = l(w) then

forestDist[θ1 , j];



forestDist[i − 1, j] + γ(T [i], −);
1
forestDist[i, j] := min

forestDist[i, j − 1] + γ(−, T2 [ j]);



forestDist[i − 1, j − 1] + γ(T1 [i], T2 [ j]).
treeDist[i, j] := forestDist[i, j].
else

forestDist[l(i) − 1, j];



forestDist[i − 1, j] + γ(T [i], −);
1
forestDist[i, j] := min

forestDist[i,
j
−
1]
+
γ(−,
T2 [ j]);



forestDist[l(i) − 1, l( j) − 1] + treeDist[i, j].
Funktion compute_Psi(v, w)
Soll das approximative Baum-Matching-Problem für Bäume T1 , T2 hingegen über die
Schneide-Operation gelöst werden, d.h. die Edit-Distanz zwischen T1 (v) und T2 für alle v ∈ T1 berechnet werden, wenn Null oder mehr Knoten in T1 (v) mit der Operation
 abgeschnitten werden können, so kann eine Berechnungsvorschrift dazu aus dem
nächsten Satz entnommen werden.
Satz 6.3
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ V (T1 ), w ∈ V (T2 ), i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
Dann gelten folgende Rekursionen:
(1) Φ(θ , θ ) = 0,
(2) Φ(T1 [l(v)..i], θ ) = Φ(T1 [l(v)..l(i) − 1], θ ) + γ(T1 [i], −),
(3) Φ(θ , T2 [l(w).. j]) = Φ(θ , T2 [l(w).. j − 1]) + γ(−, T2 [ j]),
Kapitel 6. Approximative Baumsuche
53


Φ(T1 [l(v)..l(i) − 1], T2 [l(w).. j]) + γ(T1 [i], −),





Φ(T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),





Φ(T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),





Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
(4) Φ(T1 [l(v)..i], T2 [l(w).. j]) = min
+Φ(θ , T2 [l( j).. j − 1])



+γ(T1 [i], T2 [ j]),





Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])





+Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1])



 +γ(T [i], T [ j]).
1
2
Beweis:
Die erste und die dritte Gleichung entsprechen genau den Rekursionsformeln (1) und
(3) des Satzes 3.4 zur Berechnung der Edit-Distanz, da der erste Baum leer ist und
sich dort somit keine Knoten abschneiden lassen. In der zweiten Gleichung kann der
gesamte Teilbaum T1 (i) ohne Kosten in T1 [l(v)..i] mit der Operation  abgeschnitten
werden. Somit ist die Edit-Distanz in diesem Fall
Φ(T1 [l(v)..i], θ ) = Φ(T1 [l(v)..l(i) − 1], θ ) + γ(T1 [i], −).
Für die vierte Gleichung sei C eine konsistente Menge, die δ (T1 [l(v)..i]  C, T2 [l(w).. j])
derart minimiert, dass es δ (T1 [l(v)..i]  C, T2 [l(w).. j]) = Ψ (T1 [l(v)..i], T2 [l(w).. j]) gilt.
Weiterhin sei M eine optimale Edit-Distanz-Abbildung zwischen T1 [l(v)..i]  C und
T2 [l(w).. j]. Dabei ergeben sich wie im Fall der vierten Gleichung des Satzes 3.4 für die
Knoten i und j in Zusammenhang mit M insgesamt drei Möglichkeiten:
(1) i ∈
/ {v | (v, w) ∈ M} : Dann muss i in T1 [l(v)..i] gelöscht werden. Hier unterscheidet
man zwei Unterfälle:
(a) i ∈ C : Dann folgt
Φ(T1 [l(v)..i], T2 [l(w).. j]) = Φ(T1 [l(v)..l(i) − 1], T2 [l(w).. j]) + γ(T1 [i], −).
(b) i ∈
/ C : Dann folgt
Φ(T1 [l(v)..i], T2 [l(w).. j]) = Φ(T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −).
(2) j ∈
/ {w | (v, w) ∈ M} : Dann muss j in T2 [l(w)..w] Da nur Knoten in T1 abgeschnitten
werden dürfen, gibt es hier nur einen Fall:
Φ(T1 [l(v)..i], T2 [l(w).. j]) = Φ(T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]).
(3) (i, j) ∈ M : Hierbei existieren wieder zwei Unterfälle:
(a) i ∈ C : Dann folgt
Φ(T1 [l(v)..i], T2 [l(w).. j]) = Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
+ Φ(θ , T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j]).
54
Approximative Suche in Baumstrukturen
(b) i ∈
/ C : Dann folgt
Φ(T1 [l(v)..i], T2 [l(w).. j]) = Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])
+ Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j]).
Das Minimum aller behandelten Fälle liefert die Gleichung (4).
Wiederum lässt sich die vierte Gleichung des Satzes 6.3 vereinfachen und in folgende
zwei Teile zerlegen. Der erste Teil gibt mit der Bedingung l(i) = l(v) und l( j) = l(w) das
approximative Baum-Matching-Problem an, wogegen der zweite Teil für das approximative Wald-Matching-Problem steht.
Satz 6.4
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ V (T1 ), w ∈ V (T2 ), i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}.
(1) Falls l(i) = l(v) und l( j) = l(w), dann gilt:


Φ(θ , T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]),

Φ(T [l(v)..i − 1], T [l(w).. j]) + γ(T [i], −),
1
2
1
Φ(T1 [l(v)..i], T2 [l(w).. j]) = min

Φ(T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),



Φ(T1 [l(v)..i − 1], T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
(2) Sonst:


Φ(T1 [l(v)..l(i) − 1], T2 [l(w).. j]) + γ(T1 [i], −),





Φ(T1 [l(v)..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),
Φ(T1 [l(v)..i], T2 [l(w).. j]) = min Φ(T1 [l(v)..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),



Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1])



 +Φ(T (i), T ( j)).
1
2
Beweis:
Betrachte die Gleichung (4) des Satzes 6.3. Falls l(i) = l(v) und l( j) = l(w), dann wird
aus dem ersten Fall der Minimumfunktion,
Φ(θ , T2 [l(w).. j]) + γ(T1 [i], −),
(6.1)
Φ(θ , T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
(6.2)
und aus dem vierten Fall,
Setze Gleichung (3) des Satzes 6.3 in die Gleichung 6.1 ein. Dann folgt
Φ(θ , T2 [l(w).. j]) + γ(T1 [i], −) = Φ(θ , T2 [l(w).. j − 1]) + γ(−, T2 [ j]) + γ(T1 [i], −)
Kapitel 6. Approximative Baumsuche
55
und mit der Dreiecksungleichung
≥ Φ(θ , T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
Es gilt also, dass Gleichung 6.1 ≥ Gleichung 6.2. Somit ersetzt die Distanz der Gleichung
6.2 in der Rekursionsformel (1) zwei der oben untersuchten Fälle. Außerdem gilt für
den fünften Fall der Minimumfunktion,
Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1]) + Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j])
= Φ(T1 [l(i)..l(i) − 1], T2 [l( j)..l( j) − 1]) + Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j])
= Φ(θ , θ ) + Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j])
= Φ(T1 [l(i)..i − 1], T2 [l( j).. j − 1]) + γ(T1 [i], T2 [ j]).
Demzufolge ist die Rekursionsformel (1) korrekt.
Falls l(i) 6= l(v) oder l( j) 6= l(w), so können die Fälle vier und fünf der Minimumfunktion
nach dem gleichen Muster wie im Satz 4.1 durch
Φ(T1 [l(v)..l(i) − 1], T2 [l(w)..l( j) − 1]) + Φ(T1 (i), T2 ( j))
ersetzt werden.
Nun kann auch das approximative Baum-Matching-Problem über die SchneideOperation  mit dem Zhang-Shasha-Algorithmus gelöst werden, indem einfach die
Funktion compute_delta durch die folgende Funktion compute_Phi ersetzt wird,
die nach den Sätzen 6.3 und 6.4 aufgebaut ist.
56
Approximative Suche in Baumstrukturen
Eingabe : Knoten v ∈ V (T1 ) und w ∈ V (T2 ).
Ausgabe: {Φ(T1 [l(v)..i], T2 [l(w).. j]) | i ∈ {l(v), . . . , v} und j ∈ {l(w), . . . , w}}.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
θ1 := l(v) − 1
θ2 := l(w) − 1
forestDist[θ1 , θ2 ] = 0
for i := l(v) to v do
forestDist[i, θ2 ] = forestDist[l(i) − 1, θ2 ] + γ(T1 [i], −)
for j := l(w) to w do
forestDist[θ1 , j] = forestDist[θ1 , j − 1] + γ(−, T2 [ j])
for i := l(v) to v do
for j := l(w) to w do
if l(i) = l(v) and l( j) = l(w) then

forestDist[θ1 , j − 1] + γ(T1 [i], T2 [ j]);



forestDist[i − 1, j] + γ(T [i], −);
1
forestDist[i, j] := min

forestDist[i,
j
−
1]
+
γ(−,
T2 [ j]);



forestDist[i − 1, j − 1] + γ(T1 [i], T2 [ j]).
treeDist[i, j] := forestDist[i, j].
else

forestDist[l(i) − 1, j] + γ(T1 [i], −);



forestDist[i − 1, j] + γ(T [i], −);
1
forestDist[i, j] := min

forestDist[i, j − 1] + γ(−, T2 [ j]);



forestDist[l(i) − 1, l( j) − 1] + treeDist[i, j].
Funktion compute_Phi(v, w)
Es ist offensichtlich, dass die beiden in diesem Abschnitt vorgestellten abgeänderten Versionen des Zhang-Shasha-Algorithmus zur Lösung des approximativen Baum-MatchingProblems die gleiche Zeit- und Speicherkomplexität wie der ursprüngliche Algorithmus
besitzen.
6.2 Approximative Baumsuche nach Jansson und Peng
Die in dieser Abreit bisher vorgestellten Verfahren, wie der Zhang-Shasha- oder JiangWang-Zhang-Algorithmus, vergleichen ganze Baumstrukturen miteinander und helfen dabei eine Aussage über deren Ähnlichkeit zu treffen. In vielen hierarchischen
Strukturen, wie den XML-Dokumenten [CAM02] oder den RNA-Sekundärstrukturen
[HTGK03, SZ90], die mit Bäumen modelliert werden können, geht es aber auch oft
darum, bestimmte zusammenhängende Teilstrukturen bzw. Suchmuster (Pattern) zu
finden, wobei hier gewisse Abweichungen erlaubt sind. Allgemein könnte man das auftretende Problem folgendermaßen formulieren:
Kapitel 6. Approximative Baumsuche
57
Problem:
Gegeben ist ein Baum T und ein Baum P (das Pattern). Finde eine Teilstruktur von T ,
die zu P am ähnlichsten ist.
Im Gegensatz zu Zeichenketten, wo zusammenhängende Teilbereiche durch aufeinanderfolgende Zeichen wiedergegeben werden, gibt es bei den mehrdimensionalen Strukturen wie Bäumen, viele Möglichkeiten solche Teilstrukturen zu definieren. Beruhend
auf Jansson und Peng [JP06] werden in diesem Abschnitt drei verschiedene Typen von
Teilstrukturen eines Baumes definiert und für jede von ihnen ein Algorithmus zur Lösung des oben beschriebenen Problems angegeben.
Definition 6.6 (Teilstrukturen)
Sei T ein geordneter Baum. Dann werden die Teilstrukturen von T wie folgt definiert:
Einfache Teilstruktur: Ein beliebiger verbundener Teilgraph von T . (siehe Abbildung 6.2b)
Geschwister-Teilstruktur: Eine Menge von disjunkten einfachen Teilstrukturen, dessen Wur-
zeln Geschwister in T sind3 . (siehe Abbildung 6.2c)
Geschlossener Teilwald: Eine Folge von Teilbäumen, dessen Wurzeln aufeinanderfolgende
Geschwister in T sind. (siehe Abbildung 6.2d)
In ihrer Arbeit [JP06] betrachten Jansson und Peng, das in diesem Abschnitt behandelte
Problem anstelle von Bäumen für zwei Wälder. Lösen es aber, indem sie zunächst jeweils
die in den Wäldern vorkommenden Bäume durch eine imaginäre Wurzel verbinden, diese Wurzel mit dem speziellen Symbol ∈
/ Σ beschriften und die Kostenfunktion γ für alle
a, b ∈ Σ durch γ(a, ) = 0, γ(, b) = 0, γ(, ) = 0, γ(, −) ≥ 0, γ(−, ) ≥ 0 erweitern. Auf
diese Weise lösen sie das Problem zwar für Wälder, setzen dennoch alle ihre Algorithmen im engeren Sinne auf Bäume an. Aus diesem Grund werden alle nachfolgenden
Algorithmen nur für Bäume betrachtet. Sie lassen sich jedoch wie bei Jansson und Peng
leicht auf Wälder anwenden. Außerdem werden Algorithmen angegeben, die nur die
Kosten einer optimalen Lösung berechnen. Wie schon im Falle der bisher beschriebenen
Algorithmen, lässt sich die Lösung selbst leicht durch einfache Rückverfolgungstechniken bestimmen.
Als erstes soll der Jansson-Peng-Algorithmus angegeben werden, der für zwei gegebene
Bäume T1 und T2 , die zu T2 ähnlichste einfache Teilstruktur von T1 findet. Sei im Folgen0
den T1 eine einfache Teilstruktur von T1 mit einer Wurzel v ∈ T1 . Laut der Definition 6.6
ist jeder beliebiger verbundener Graph von T1 mit einer Wurzel v ∈ V (T1 ), eine einfache
0
0
Teilstruktur T1 von T1 (v). T1 entsteht also dadurch, dass man alle Knoten irgendeiner
konsistenten Menge C ∈ ϒ (T1 (v)) aus T1 (v) mit der Operation entfernt. Damit kann
jetzt der folgende Satz formuliert werden.
Satz 6.5
0
Sei T ein Baum und v ∈ T . Der Baum T mit einer Wurzel v ist eine einfache Teilstruktur
0
von T gdw. T = T (v) C für irgendein C ∈ ϒ (T (v)).
3 Die
Geschwister müssen nicht notwendigerweise aufeinanderfolgend sein.
58
Approximative Suche in Baumstrukturen
T
33
32
7
22
14
21
31
5
26
1
6
2
3
12
4
17
13
11
29
24 25
28
8
15
9
23
20
16 18
30
19
10
27
(a) Baum T .
22
26
32
7
14
21
12
17
11
31
29
20
5
26
1
6
24 25
30
28
13
2
3
4
8
27
(b) Einfache Teilstruktur
von T .
(c) Geschwister-Teilstruktur
von T .
(d) Geschlossener Teilwald von T .
Abbildung 6.2: Teilstrukturen eines Baumes.
Um eine einfache Teilstruktur von T1 zu finden, die zu T2 am ähnlichsten ist, muss man
für alle v ∈ V (T1 (v)) die Teilstrukturen von T1 (v) mit T2 vergleichen. Nach Satz 6.5 entspricht das, dem Finden einer konsistenten Menge C ∈ ϒ (T1 (v)), die δ (T1 (v) C, T2 )
minimiert. Das korrespondiert mit dem approximativen Baum-Matching-Problem4 und
kann durch dessen Lösung bestimmt werden. Hierfür benutzen Jansson und Peng die
abgeänderte Version des Zhang-Shasha-Algorithmus mit der Funktion compute_Psi
aus dem Abschnitt 6.1 und ersetzen nur den siebten Schritt der Hauptschleife im ZhangShasha-Algorithmus durch minv∈V (T1 ) Ψ (T1 (v), T2 ). In der Implementierung des JanssonPeng-Algorithmus für einfache Teilstrukturen, wird im siebten Schritt der kleinste Eintrag in der permanenten Distanzmatrix treeDist unter allen Zeilen der letzten Spalte, d.h. minv∈V (T1 ) {treeDist[v, |T1 |]}, zurückgegeben, da alle Werte von Edit-Distanzen
Ψ (T1 (v), T2 (w)) unter treeDist[v, w] gespeichert werden. (siehe Algorithmus 6.3)
Als nächstes soll der Jansson-Peng-Algorithmus besprochen werden, der das am Anfang dieses Abschnittes beschriebene Problem für Geschwister-Teilstrukturen löst. Er
entspricht im Wesentlichen dem Algorithmus 6.3, bis auf den letzten Schritt in der
Hauptschleife. Es soll also das nachfolgende Problem gelöst werden.
4 siehe
Definition 6.5
Kapitel 6. Approximative Baumsuche
59
Eingabe : Baum T1 und T2 .
Ausgabe: minv∈V (T1 ) Ψ (T1 (v), T2 ).
/* treeDist[1..|V (T1 )|,1..|V (T2 )|] ist die permanente
Distanzmatrix
*/
/* ----------------- Vorbereitungsphase ----------------- */
1:
berechne l(), K(T1 )[] und K(T2 )[].
/* ------------------- Hauptschleife -------------------- */
6:
for i := 1 to |K(T1 )| do
for j := 1 to |K(T2 )| do
v := K(T1 )[i]
w := K(T2 )[ j]
call compute_Psi(v, w).
7:
return minx∈V (T1 ) {treeDist[x, w]}.
2:
3:
4:
5:
Algorithmus 6.3: Jansson-Peng-Algorithmus zum Finden einer zu T2 ähnlichsten
einfachen Teilstruktur von T1 .
Problem:
Gegeben sind zwei geordnete Bäume T1 und T2 . Gesucht ist eine GeschwisterTeilstruktur von T1 , die zu T2 am ähnlichsten ist.
0
Sei im Folgenden v ∈ V (T1 ) und v1 , . . . , vi die Folge seiner Kinder. Weiterhin sei T1
eine zu T2 ähnlichste Geschwister-Teilstruktur von T1 , deren Wurzeln vs , . . . vt mit
1 ≤ s ≤ t ≤ i die Kinder von v sind. Setze C = {v1 , . . . , vi }\{vs , . . . , vt }. Damit ist die
0
Menge C konsistent und C ∈ ϒ (T1 ). Unter diesen Annahmen ist T1 auch eine zu T2
ähnlichste Geschwister-Teilstruktur des geschlossenen Teilwaldes F1 (v1 , vi ) von T1 , da
0
F1 (v1 , vi ) C = F1 (vs , vt ) = T1 und die Entferne-Operation kostenfrei ist. Infolgedessen
0
ist δ (T1 , T2 ) = Ψ (F1 (v1 , vi ), T2 ) und das zu lösende Problem reduziert sich auf das Finden
von minv∈V (T1 ) {Ψ (F1 (v1 , vi ), T2 )}. Sind die Knoten in Postordnung nummeriert, entspricht
das dem Finden von minv∈V (T1 ) {Ψ (T1 [l(v)..v − 1], T2 )}.
Das hat zur Folge, dass die Funktion compute_Psi in diesem Fall wiederverwendet werden kann. Es wird nur ein zusätzlicher Speicher reserviert, in dem die Werte
Ψ (T1 [l(v)..v − 1], T2 ) für alle v ∈ V (T1 ) in einem Feld dist der Länge |T1 | unter dist[v]
permanent gespeichert werden. Anschließend wird im letzten Schritt des Zhang-ShashaAlgorithmus der Wert minv∈V (T1 ) {dist[v]} zurückgegeben. (siehe Algorithmus 6.4)
Die beiden bisher in diesem Abschnitt vorgestellten Algorithmen 6.3 und 6.4 von Jannson und Peng besitzen dieselbe Zeit- und Speicherkomplexität wie der Zhang-ShashaAlgorithmus. Keines dieser Algorithmen lässt sich für die dritte Variante des Problems,
wo ein zu T2 ähnlichster geschlossener Wald von T1 gesucht wird, anwenden, da sie
für zwei Geschwister-Knoten v1 , v2 ∈ V (T1 ) mit v1 < v2 und v1 ∈ K(T1 ) die Edit-Distanz
δ (F1 (v1 , v2 ), T2 ) nicht berechnen. Weil für zwei verschiedene Schlüsselknoten v, w ∈ K(T1 )
60
Approximative Suche in Baumstrukturen
Eingabe : Baum T1 und T2 .
Ausgabe: minv∈T1 Ψ (T1 [l(v)..v − 1], T2 ).
/* dist[1..|V (T1 )|] ist ein Feld zur Speicherung von
Ψ (T1 [l(v)..v − 1], T2 ).
*/
/* ----------------- Vorbereitungsphase ----------------- */
1:
berechne l(), K(T1 )[] und K(T2 )[].
/* ------------------- Hauptschleife -------------------- */
6:
for i := 1 to |K(T1 )| do
for j := 1 to |K(T2 )| do
v := K(T1 )[i]
w := K(T2 )[ j]
call compute_Psi(v, w).
7:
return minv∈T1 {dist[v]}.
2:
3:
4:
5:
Algorithmus 6.4: Jansson-Peng-Algorithmus zum Finden einer zu T2 ähnlichsten
Geschwister-Teilstruktur von T1 .
stets l(v) 6= l(w) gilt, wird die Edit-Distanz δ (F1 (v1 , v2 ), T2 ) auch dann nicht berechnet,
wenn die Funktion compute_delta im Zhang-Shasha-Algorithmus für einen anderen
Schlüsselknoten w > v1 aufgerufen wird. Aus diesem Grund geben Jansson und Peng
andere Beziehungen zwischen den Edit-Distanzen an, die die Grundlage zur Lösung
des oben genannten Problems für geschlossene Teilwälder bilden. Der nächste Satz gibt
diese Beziehungen wieder und verwendet folgende Schreibweisen:
Sei T ein Baum oder ein Wald, v ∈ L(T ) und i ∈ V (T ). Schreibe v i, falls v ein Nachfolger
von i in T ist und v i andererseits. Sind alle l(i) in der Vorbereitungsphase berechnet
worden, so kann sofort durch die Bedingung l(i) ≤ v ≤ i festgestellt werden, ob v i ist.
Satz 6.6
Seien T1 und T2 geordnete Bäume, deren Knoten in Postordnung von links nach rechts
durchnummeriert sind. Seien v ∈ L(T1 ), w ∈ K(T2 ), i ∈ {v, . . . , |T1 |} und j ∈ {l(w), . . . , w}.
Dann ergibt sich δ (T1 [v..i], T2 [l(w).. j]) aus dem Minimum der folgenden drei Werte:

δ (T1 [v..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),





δ (T1 [v..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),



δ (T [v..i − 1], T [l(w).. j − 1]) + γ(T [i], T [ j]),
falls v i und l(w) j,

1
2
1
2




δ (θ , T2 [l(w)..l( j) − 1]) + δ (T1 [v..i], T2 ( j)),
falls v i und l(w) j,






falls v i und l(w) j,
δ (T1 [v..l(i) − 1], θ ) + δ (T1 (i), T2 ( j)),




δ (T1 [v..l(i) − 1], T2 [l(w)..l( j) − 1]) + δ (T1 (i), T2 ( j)), falls v i und l(w) j.
Beweis:
Betrachte eine optimale Edit-Distanz-Abbildung M zwischen T1 [v..i] und T2 [l(w).. j]. Dann
gibt es für die Knoten i und j in Zusammenhang mit M insgesamt drei Möglichkeiten.
Kapitel 6. Approximative Baumsuche
61
Die ersten zwei Möglichkeiten mit i ∈ R1 und j ∈ R2 entsprechen denen, aus dem Satz
3.4. Für die dritte Möglichkeit mit (i, j) ∈ M sind folgende vier Fälle zu unterscheiden:
(1) v i und l(w) j: Dann ist i die Wurzel einer einfachen Teilstruktur von T1 und
j, wegen l(w) ≤ j ≤ w und l(w) = l( j), die Wurzel eines Teilbaumes T2 ( j) von T2 .
Folglich ist
δ (T1 [v..i], T2 [l(w).. j]) = δ (T1 [v..i − 1], T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
(2) v i und l(w) j: Dann ist i die Wurzel einer einfachen Teilstruktur von T1
und j, wegen l(w) ≤ j ≤ w und l(w) 6= l( j), die rechteste Wurzel eines Teilwaldes T2 [l(w).. j] von T2 . Folglich ist
δ (T1 [v..i], T2 [l(w).. j]) = δ (θ , T2 [l(w)..l( j) − 1]) + δ (T1 [v..i], T2 ( j)).
(3) v i und l(w) j: Dann ist i die rechteste Wurzel eines Waldes T1 [v..i] und j die
Wurzel eines Teilbaumes T2 ( j) von T2 . Folglich ist
δ (T1 [v..i], T2 [l(w).. j]) = δ (T1 [v..l(i) − 1], θ ) + δ (T1 (i), T2 ( j)).
(4) v i und l(w) j: Dann ist i die rechteste Wurzel eines Waldes T1 [v..i] und j die
rechteste Wurzel eines Teilwaldes T2 [l(w).. j] von T2 . Folglich ist
δ (T1 [v..i], T2 [l(w).. j]) = δ (T1 [v..l(i) − 1], T2 [l(w)..l( j) − 1]) + δ (T1 (i), T2 ( j)).
Um den Algorithmus zu erhalten, der einen zu T2 ähnlichsten geschlossenen Teilwald
von T1 findet, wird die Funktion compute_delta des Zhang-Shasha-Algorithmus 4.2
neu nach der Rekursionsformel des Satzes 6.6 unter Anwendung dynamischer Programmierung konstruiert. Ferner wird in der Vorbereitungsphase die Menge der Blätter
L(T1 ) festgestellt, satt wie bisher im Zhang-Shasha-Algorithmus die Menge der Schlüsselknoten K(T1 ). Die Blätter aus L(T1 ) werden nach ihrer Nummerierung in Postordnung
aufsteigend sortiert und in einem Hilfsfeld gespeichert. Die neu konstruierte Funktion
compute_delta wird jetzt in der Hauptschleife des Algorithmus 6.6 für alle v ∈ L(T1 ),
absteigend nach ihrer Nummerierung, und alle w ∈ K(T2 ), in aufsteigender Ordnung,
aufgerufen. Mit Hilfe des Satzes 6.6 berechnet sie die Werte δ (T1 [v..i], T2 [l(w).. j]) für
alle i ∈ {v, . . . , |T1 |} und j ∈ {l(w), . . . , w}.
Damit in compute_delta alle Terme entsprechend nach Satz 6.6 in O(1) Zeit ausgewertet werden können, werden die Werte δ (T1 [v..i], T2 [l(w).. j]) für alle i ∈ {v, . . . , |T1 |}
und j ∈ {l(w), . . . , w}, sofort nachdem sie mit dynamischer Programmierung berechnet
sind, in einem |T1 | × |T2 |- zweidimensionalen Feld temporär bis zum nächsten Aufruf
von compute_delta gespeichert. Weiterhin werden die Werte δ (T1 (i), T2 ( j)) für alle
i ∈ V (T1 ) und j ∈ V (T2 ) in einem zusätzlichen |T1 | × |T2 |- zweidimensionalen Feld und
δ (T1 [v..i], T2 ( j)) für jedes v ∈ L(T1 ) und alle i ∈ V (T1 ), die die Bedingung v i erfüllen,
in einem weiteren zweidimensionalen Feld der Größe depth(T1 ) · |T2 | während der gesamten Ausführung des Algorithmus permanent gespeichert, da sie nach Satz 6.6 in
folgenden Fällen zur Berechnung von δ (T1 [v..i], T2 [l(w).. j]) gebraucht werden:
62
Approximative Suche in Baumstrukturen
Eingabe : Knoten v ∈ L(T1 ) und w ∈ K(T2 ).
Ausgabe: {δ (T1 [v..i], T2 [l(w).. j]) | i ∈ {v, . . . , |T1 |} und j ∈ {l(w), . . . , w}}.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for i := v to |T1 | do
δ (T1 [v..i], θ ) := δ (T1 [v..i − 1], θ ) + γ(T1 [i], −).
for j := l(w) to w do
δ (θ , T2 [l(w).. j]) := δ (θ , T2 [l(w).. j − 1]) + γ(−, T2 [ j]).
for i := v to |T1 | do
for j := l(w) to w do
if v i and l(w) j then
d := δ (T1 [v..i − 1], T2 [l(w).. j − 1]) + γ(T1 [i], T2 [ j]).
else if v i and l(w) j then
d := δ (θ , T2 [l(w)..l( j) − 1]) + δ (T1 [v..i], T2 ( j)).
else
/* Hier werden zwei Fälle zusammengefasst für
/* v i
d := δ (T1 [v..l(i) − 1], T2 [l(w)..l( j) − 1]) + δ (T1 (i), T2 ( j)).


δ (T1 [v..i − 1], T2 [l(w).. j]) + γ(T1 [i], −),
δ (T1 [v..i], T2 [l(w).. j]) = min δ (T1 [v..i], T2 [l(w).. j − 1]) + γ(−, T2 [ j]),


d.
*/
*/
Funktion compute_delta(v, w)
(1) δ (T1 (i), T2 ( j)) für v i: Wegen v ≤ i ≤ |T1 | muss i rechts von v liegen und somit
v < l(i) sein. Setze v2 = v und v1 = l(i). Da compute_delta für alle Blätter v in
absteigender Ordnung aufgerufen wird, wurde compute_delta für alle v1 > v2
bereits aufgerufen und somit die Edit-Distanz δ (T1 (i), T2 ( j)) in einem früheren
Lauf berechnet.
(2) δ (T1 [v..i], T2 ( j)) für v i und l(w) j: Wegen l(w) ≤ j ≤ w und l( j) 6= l(w) muss j <
w sein. Also ist j entweder ein Schlüsselknoten, der im Teilbaum T (w) liegt, oder
ein echter Nachfolger eines anderen Schlüsselknotens w1 < w mit l( j) = l(w1 ), der
sich ebenfalls im Teilbaum T1 (w) befindet. In beiden Fällen muss δ (T1 [v..i], T2 ( j))
schon in einem früheren Lauf für einen Schlüsselknoten w1 mit l(w1 ) ≤ j ≤ w1 < w
berechnet worden sein, da compute_delta für alle Schlüsselknoten w in aufsteigender Ordnung aufgerufen wird und dabei δ (T1 [v..i], T2 [l(w).. j]) für alle i ∈
{v, . . . , |T1 |} und j ∈ {l(w), . . . , w} berechnet.
Anschließend wird am Ende des Algorithmus, nachdem die Werte δ (T1 [v..i], T2 [l(w).. j])
für alle v ∈ L(T1 ) und w ∈ K(T2 ) mit i ∈ {v, . . . , |T1 |}, j ∈ {l(w), . . . , w} bestimmt wurden,
min{δ (F1 (v1 , v2 ), T2 ) | v1 und v2 sind Geschwister in T1 } zurückgegeben.
Ist z.B. F1 (x, y) der zu T2 ähnlichster geschlossener Teilwald von T1 , dann wurde
δ (F1 (x, y), T2 ) von dem Algorithmus 6.6 auf jeden Fall berechnet, wie der folgende Beweis zeigt.
Kapitel 6. Approximative Baumsuche
63
Eingabe : Baum T1 und T2 .
Ausgabe: min{δ (F1 (v1 , v2 ), T2 ) | v1 und v2 sind Geschwister in T1 }.
/* ----------------- Vorbereitungsphase ----------------- */
1:
berechne l(), L(T1 )[] und K(T2 )[].
/* ------------------- Hauptschleife -------------------- */
7:
δ (θ , θ ) := 0.
for i := |L(T1 )| to 1 do
for j := 1 to |K(T2 )| do
v := L(T1 )[i],
w := K(T2 )[ j],
call compute_delta(v, w).
8:
return min{δ (F1 (v1 , v2 ), T2 ) | v1 und v2 sind Geschwister in T1 }.
2:
3:
4:
5:
6:
Algorithmus 6.6: Jansson-Peng-Algorithmus zum Finden eines zu T2 ähnlichsten
geschlossenen Teilwaldes von T1
Beweis:
Für F1 (x, y) und T2 gilt:
• F1 (x, y) = T1 [l(x)..y], l(x) ∈ L(T1 ) und y ∈ {l(x), . . . , |T1 |}. Setze v = l(x) und i = y.
• T2 = T2 [l(|T2 |)..|T2 |] und |T2 | ∈ K(T2 ). Setze w = |T2 | und j = |T2 |.
Entsprechend dem Algorithmus 6.6 wird δ (F1 (x, y), T2 ) berechnet. Der Algorithmus 6.6
ist somit korrekt.
Die Funktion compute_delta ist hier der Übersichtlichkeit halber in einer allgemeinen
Form angegeben und kann bezüglich der Speichereffizienz unterschiedlich implementiert werden. Eine mögliche Realisierung in der Programmiersprache Java, wurde von
mir während dieser Arbeit in einem Java-Tool implementiert und kann dort nachvollzogen werden.
Satz 6.7
Gegeben sind zwei geordnete Bäume T1 und T2 . Der Jansson-Peng-Algorithmus 6.6
benötigt zum Finden eines zu T2 ähnlichsten Teilwaldes von T1 O(|T1 | · |T2 | · |L(T1 )| ·
min{depth(T2 ), |L(T2 )|}) Zeiteinheiten und O(|T1 | · |T2 |) Speicherplatz.
Beweis:
Für jedes v ∈ L(T1 ) und w ∈ K(T2 ) ruft der Algorithmus in der Hauptschleife die Funktion compute_delta auf, die die Werte δ (T1 [v..i], T2 [l(w).. j]) für alle i ∈ {v, . . . , |T1 |},
j ∈ {l(w), . . . , w} in einem zweidimensionalen Feld der Größe O(|T1 | · |T2 |) speichert. Diese Werte werden nur temporär gespeichert, so dass der Speicherplatz bei jedem Aufruf
von compute_delta wiederverwendet werden kann. Zusätzlich braucht der Algorithmus für jedes v ∈ L(T1 ), O(depth(T1 ) · |T2 |) Speicherplatz, um die Werte δ (T1 [v..i], T ( j))
für alle i ∈ {v, . . . , |T1 |} mit v i und alle j ∈ V (T2 ) speichern zu können. Dieser Speicher-
64
Approximative Suche in Baumstrukturen
platz kann ebenfalls für jedes v ∈ L(T1 ) wiederverwendet werden. Außerdem werden
die Edit-Distanzen δ (T1 (i), T ( j)) für alle i ∈ V (T1 ) und j ∈ V (T2 ) während der gesamten Ausführung des Algorithmus gespeichert. Insgesamt benötigt der Algorithmus also
O(|T1 | · |T2 |) Speicherplatz.
Da die Funktion compute_delta in der Hauptschleife für alle v ∈ L(T1 ), w ∈ K(T2 )
aufgerufen wird und für eine Ausführung O(|T1 [v..|T1 |]|·|T2 (w)|) Zeit in Anspruch nimmt,
benötigt der Algorithmus für die gesamte Ausführung folgende Zeit:
∑
∑
O(|T1 [v..|T1 |]| · |T2 (w)|) = O(
v∈L(T1 ) w∈K(T2 )
∑
(|T1 | − v) ·
v∈L(T1 )
∑
|T2 |).
(6.3)
w∈K(T2 )
Aus Gleichung (6.3) und Satz 4.5 folgt schließlich:
O(
∑
(|T1 | − v) ·
v∈L(T1 )
∑
w∈K(T2 )
|T2 |) ≤ O(
∑
v∈L(T1 )
|T1 | ·
∑
cdepth(w))
w∈V (T2 )
≤ O(|T1 | · |T2 | · |L(T1 )| · cdepth(T2 )).
(6.4)
Unter Anwendung des Satzes 4.4 ergibt sich aus der Ungleichung 6.4 die Laufzeitkomplexität
O(|T1 | · |T2 | · |L(T1 )| · min{depth(T2 ), |L(T2 )|}).
65
Kapitel 7. Implementierung
7 Implementierung
Zum Experimentieren wurden alle in dieser Arbeit vorgestellten Algorithmen in einem
Java-Tool implementiert. Das implementierte Java-Tool bietet eine grafische Benutzeroberfläche und kann zufällige beschriftete Bäume beliebiger Größe generieren und visualisieren. Die Abbildung 7.1 zeigt einen Screenshot des Java-Tools.
Abbildung 7.1: GUI Java-Tool.
Die zufälligen Bäume werden in der Klasse RandomTreeBuilder erzeugt. Intern
verwendet diese Klasse die von der Java Standard Edition API bereitgestellte Klasse
Random aus dem Paket java.util, um Pseudo-Zufallszahlen zu erzeugen. Die PseudoZufallszahlen werden dazu verwendet, die Größe eines jeden Teilbaumes im zu erzeugenden Baum zufällig festzulegen. Um die Knoten der Bäume mit Symbolen zu beschriften, bedient sich die Klasse RandomTreeBuilder der Klasse AlphabetGenerator,
die ein Alphabet aus einer Datei ausliest und zur Verfügung stellt. Aus diesem Alphabet greift sich ein RandomTreeBuilder Objekt zufällige Zeichen heraus und ordnet
sie verschiedenen Knoten eines Baumes zu. Das Java-Tool kann selbst erstellte Bäume
in Form einer linearen Liste einlesen und die erzeugten Bäume speichern. Um Bäume
intern verwalten zu können, wurde die von der Brown Universität entwickelte Open
Source Bibliothek „Java Data Struktures Library“ (JDSL) verwendet [JDS]. JDSL ist ei-
66
Approximative Suche in Baumstrukturen
ne Sammlung von Schnittstellen und Klassen, die grundlegende Datenstrukturen, wie
Folgen, Bäume, Graphen etc., und darauf basierende Algorithmen implementieren.
Die Abbildung 7.2 zeigt das UML-Klassendiagramm des Java-Tools. Dieses Klassendiagramm stellt nur die wesentlichen Klassen und deren Elemente dar und soll nur einen
allgemeinen Überblick über den Aufbau des Java-Tools ermöglichen. Die einzelnen Algorithmen wurden in folgenden Klassen implementiert:
ZhangShasha: Implementiert den Zhang-Shasha-Algorithmus. Das Objekt der
Klasse wird durch den Konstruktor ZhangShasha(Tree t1, Tree t2,
CostFunction f, int dec) erzeugt. Dabei gibt der formale Parameter
dec die Richtung der Zerlegung an und kann folgende Werte annehmen:
• ZhangShasha.LEFT_DECOMPOSITION = 0
• ZhangShasha.RIGHT_DECOMPOSITION = 1
JiangWangZhang: Implementiert den Jiang-Wang-Zhang-Algorithmus. Das Objekt
der Klasse wird durch den Konstruktor JiangWangZhang(Tree t1, Tree
t2, CostFunction f) erzeugt.
JanssonPeng: Implementiert den Jansson-Peng-Algorithmus für einfache Teilstrukturen, Geschwister-Teilsturkturen und geschlossene Wälder. Das Objekt der
Klasse wird durch den Konstruktor JanssonPeng(Tree t1, Tree t2,
CostFunction f, int variant) erzeugt. Dabei gibt der formale Parameter variant die Art der Teilstruktur an, für die der Algorithmus ausgeführt
werden soll. Hierbei kann variant folgende Werte annehmen:
• JanssonPeng.SIMPLE_SUBSTRUCT = 0
• JanssonPeng.SIBLING_SUBSTRUCT = 1
• JanssonPeng.CLOSED_SUBFOREST = 2
Alle diese Klassen erben von der abstrakten Klasse DistanceAlgorithm und implementieren die abstrakte Methode execute, die die Ausführung des Algorithmus startet.
Außerdem muss bei der Erzeugung eines Objektes dieser Klassen eine Kostenfunktion
festgelegt werden, die den einzelnen Edit-Operationen, abhängig vom gelöschten, eingefügten oder geänderten Symbol eines Knotens, Kosten zuordnet. Eine Kostenfunktion
wird durch die abstrakte Klasse CostFunction repräsentiert. Eine Ausprägung der
CostFunction bildet die Klasse ConstantCostFunction, die im Java-Tool voreingestellt ist und jeder Edit-Operation unabhängig von den Symbolen der Knoten konstante Kosten zuordnet. Diese Kosten können in der GUI verändert werden.
Das implementierte Java-Tool liegt neben den Quelltexten auf der beiliegenden CD als
eine ausführbare Jar-Datei vor und kann damit auf allen Plattformen ausgeführt werden.
67
Kapitel 7. Implementierung
CostFunction
+BLANK: Character = null
+NO_OP_COST: double = 0
#relabelCost(label1: Character, label2: Character): double
#delInsCost(label1: Character, label2: Character): double
+getValue(label1: Character, label2: Character): double
ConstantCostFunction
-_relableCost: double
-_delInsCost: double
+ConstantCostFunction(relabelCost: double, delInsCost: double)
#relabelCost(label1: Character, label2: Character): double
#delInsCost(label1: Character, label2: Character): double
ZhangShasha
-_tree1: Tree
-_tree2: Tree
-_func: CostFunction
+ZhangShasha(t1: Tree1, t2: Tree, f: Costfunction, dec: int)
+execute()
+getDistance(): double
DistanceAlgorithm
#_func: CostFunction
+execute()
+getDistance(): double
+defineCostFunction(f: CostFunction)
JiangWangZhang
-_tree1: Tree
-_tree2: Tree
-_func: CostFunction
+JiangWangZhang(t1: Tree1, t2: Tree, f: Costfunction)
+execute()
+getDistance(): double
JanssonPeng
-_tree1: Tree
-_tree2: Tree
-_func: CostFunction
-_variant: int
+JanssonPeng(t1: Tree1, t2: Tree, f: Costfunction, _variant: int)
+execute()
+getDistance(): double
DrawingWindow
+DrawingWindow(t1: Tree, t2: Tree)
Experiments
+main(args: String)
RandomTreeBuilder
-_tree: Tree
-_alphabet: Sequence
#gen: Random = new Random()
+randomTree(n: int): Tree
#build(p: Position, n: int)
#permute(s: Sequence)
#pickCharacter(): Character
#randomInteger(min: int, max: int): int
AlphabetGenerator
+getCharacters(): Sequence
Abbildung 7.2: UML-Klassendiagramm des Java-Tools.
Kapitel 8. Fazit und Ausblick
69
8 Fazit und Ausblick
In dieser Arbeit habe ich mich mit den Verfahren beschäftigt, die in den verschiedensten Bereichen zum Vergleich von Baumstrukturen mit Hilfe von elementaren EditOperationen eingesetzt werden. Dabei wurden die drei daraus resultierenden zentralen Probleme, Baum-Edit-Distanz, Baum-Alignment-Distanz und das Baum-InklusionProblem genau beschrieben und zueinander in Beziehung gesetzt. Ferner wurden für
die Baum-Edit- und Baum-Alignment-Distanz die grundlegendsten Algorithmen in allen
Einzelheiten detailliert analysiert und miteinander verglichen. Des Weiteren wurde das
approximative Baum-Matching-Problem ausführlich vorgestellt und dessen Anwendungen mit den dazugehörigen Algorithmen erläutert. Weiterhin wurden in dieser Arbeit
die fünf folgenden Algorithmen implementiert und getestet:
• Zhang-Shasha-Algorithmus zur Berechnung der Edit-Distanz zwischen zwei Bäumen, wobei hier sowohl die rechte als auch die linke Zerlegung für den Algorithmus umgesetzt wurden und im Java-Tool ausgewählt werden können.
• Jiang-Wang-Zhang-Algorithmus zur Berechnung der Alignment-Distanz zwischen
zwei Bäumen.
• Jansson-Peng-Algorithmus zum Finden einer ähnlichsten Teilstruktur eines Baumes zu einem anderen Baum für die Varianten, einfache Teilstruktur, GeschwisterTeilstruktur und geschlossener Teilwald.
Alle diese Algorithmen können in dem implementierten Java-Tool für beliebig generierte beschriftete Bäume ausgeführt werden. Der im Abschnitt 4.2 vorgestellte KleinAlgorithmus konnte jedoch am Ende aufgrund von fehlenden zeitlichen Ressourcen in
dieser Arbeit programmiertechnisch nicht mehr umgesetzt werden, da er in der Literatur zwar theoretisch gut beschrieben ist, praktisch aber viele Realisierungen ermöglicht und sich deswegen schwer implementieren lässt. Es muss daher noch anhand von konkreten Anwendungen genau untersucht werden, ob er tatsächlich, wie
theoretisch angegeben, gegenüber dem Zhang-Shasha-Algorithmus in der Praxis Vorteile bietet. Generell wurde außerdem die Beobachtung festgestellt, dass je komplexer
ein Algorithmus aufgebaut ist, er seine theoretisch angegeben Komplexitätsschranken
praktisch nicht halten kann. So wurden die Laufzeiten des Zhang-Shasha- und JiangWang-Zhang-Algorithmus miteinander verglichen. Die theoretisch angegebene Laufzeit O(|T1 | · |T2 | · ((deg(T1 ) + deg(T2 ))2 ) des Jiang-Wang-Zhang-Algorithmus ist gegenüber der Laufzeit O(|T1 | · |T2 | · min{depth(T1 ), L(T1 )} · min{depth(T2 ), L(T2 )}) des ZhangShasha-Algorithmus eindeutig schneller, da stets für alle Bäume T deg(T ) ≤ L(T ) gilt
und laut [JWZ95] in der Praxis, z.B. beim Vergleich von RNA-Sekundärstrukturen,
sogar die Beziehung deg(T ) L(T ) und deg(T ) depth(T ) besteht. Jedoch konnte
beim Testen mit zufällig generierten Bäumen auf dem Computer mit einem Pentium
70
Approximative Suche in Baumstrukturen
M Prozessor (1400 MHz) und 512 MB RAM keine schnellere Laufzeit des Jiang-WangZhang-Algorithmus gegenüber dem Zhang-Shasha-Algorithmus gemessen werden, da
der Jiang-Wang-Zhang-Algorithmus wegen seiner komplexeren Struktur in der Programmiersprache Java mit mehr laufzeitintensiven Elementen implementiert werden
musste als der Zhang-Shasha-Algorithmus. Leider konnte aufgrund mangelnder Zeit am
Ende keine grafische Auswertung dieses Sachverhaltes in dieser Arbeit mehr vorgenommen werden.
Literaturverzeichnis
71
Literaturverzeichnis
[CAM02]
C OBENA, Gregory ; A BITEBOUL, Serge ; M ARIAN, Amelie: Detecting Changes in XML Documents. In: Data Engineering, International Conference on
(2002), S. 0041
[Che98]
C HEN, Weimin: More efficient algorithm for ordered tree inclusion. In: J.
Algorithms 26 (1998), Nr. 2, S. 370–385
[CR94]
C ROCHEMORE, Maxime ; RYTTER, Wojciech: Text Algorithms. Oxford University Press, 1994
[CSRL01] C ORMEN, Thomas H. ; S TEIN, Clifford ; R IVEST, Ronald L. ; L EISERSON,
Charles E.: Introduction to Algorithms. 2. The MIT Press and McGraw-Hill
Book Company, 2001. – ISBN 0262032937
[DT03]
D ULUCQ, Serge ; T ICHIT, Laurent: RNA Secondary structure comparison:
exact analysis of the Zhang–Shasha tree edit algorithm. In: Theor. Comput.
Sci. 306 (2003), Nr. 1-3, S. 471–484
[GT87]
G ONNET, Gaston H. ; T OMPA, Frank W.: Mind your grammar - a new approach to text databases. In: In Proc. VLDB’87, Morgan Haufman Publishers,
1987, S. 339–346
[HT84]
H AREL, Dov ; TARJAN, Robert E.: Fast algorithms for finding nearest common
ancestors. In: SIAM J. Comput. 13 (1984), Nr. 2, S. 338–355
[HTGK03] H ÖCHSMANN, Matthias ; T ÖLLER, Thomas ; G IEGERICH, Robert ; KURTZ, Stefan: Local Similarity in RNA Secondary Structures. In: Computational Systems Bioinformatics Conference, International IEEE Computer Society (2003),
S. 159
[JDS]
The Data Structures Library in Java. http://www.cs.brown.edu/cgc/
jdsl
[JP06]
JANSSON, Jesper ; P ENG, Zeshan: Algorithms for Finding a Most Similar
Subforest. In: CPM, 2006, S. 377–388
[JWZ95]
J IANG, T. ; WANG, J. ; Z HANG, K.: Alignment of Trees - An Alternative to
Tree Edit. In: Theor. Comput. Sci. 143 (1995), Nr. 1, S. 137–148
[Kle98]
K LEIN, Philip N.: Computing the Edit-Distance Between Unrooted Ordered
Trees. In: ESA ’98: Proceedings of the 6th Annual European Symposium on
Algorithms. Springer-Verlag, 1998, S. 91–102
72
Approximative Suche in Baumstrukturen
[KM95]
K ILPELAINEN, Pekka ; M ANNILA, Heikki: Ordered and Unordered Tree Inclusion. In: SIAM J. Comput. 24 (1995), Nr. 2, S. 340–356
[Knu69]
K NUTH, Donald E.: The art of computer programming. Bd. 1. Boston, MA,
USA : Addison-Wesley Longman Publishing Co., 1969
[Par07]
PARCHMANN, Prof. Dr. R.: Skript zur Vorlesung Approximative Zeichenkettensuche. (2007)
[PY88]
PAPADIMITRIOU, Christos ; YANNAKAKIS, Mihalis: Optimization, approximation, and complexity classes. In: STOC ’88: Proceedings of the twentieth annual
ACM symposium on Theory of computing. New York, NY, USA : ACM, 1988,
S. 229–234
[ST81]
S LEATOR, Daniel D. ; TARJAN, Robert E.: A data structure for dynamic trees.
In: STOC ’81: Proceedings of the thirteenth annual ACM symposium on Theory
of computing. New York, NY, USA : ACM, 1981, S. 114–122
[SZ90]
S HAPIRO, B. A. ; Z HANG, K.: Comparing multiple RNA secondary structures using tree comparisons. In: Computer Applications in the Biosciences 6
(1990), S. 309–318
[Tai79]
TAI, Kuo-Chung: The Tree-to-Tree Correction Problem. In: Journal of the
ACM (JACM) 26 (1979), Juli, Nr. 3, S. 422–433. – ISSN 0004–5411
[TSM91]
TAGUE, Jean ; S ALMINEN, Airi ; M C C LELLAN, Charles: Complete formal model for information retrieval systems. In: SIGIR ’91: Proceedings of the 14th
annual international ACM SIGIR conference on Research and development in
information retrieval. New York, NY, USA : ACM, 1991, S. 14–20
[WF74]
WAGNER, Robert A. ; F ISCHER, Michael J.: The String-to-String Correction
Problem. In: Journal of the ACM (JACM) 21 (1974), Januar, Nr. 1, S. 168–
173. – ISSN 0004–5411
[WS81]
WATERMAN, M. S. ; S MITH, T. F.: Identification of common molecular subsequences. In: Journal of Molecular Biology 147 (1981), S. 195–197
[ZJ94]
Z HANG, Kaizhong ; J IANG, Tao: Some MAX SNP-hard results concerning
unordered labeled trees. In: Inf. Process. Lett. 49 (1994), Nr. 5, S. 249–254
[ZS89]
Z HANG, K. ; S HASHA, D.: Simple fast algorithms for the editing distance between trees and related problems. In: SIAM J. Comput. 18 (1989), Dezember,
Nr. 6, S. 1245–1262. – ISSN 0097–5397
[ZSS92]
Z HANG, Kaizhong ; S TATMAN, Rick ; S HASHA, Dennis: On the editing distance between unordered labeled trees. In: Inf. Process. Lett. 42 (1992), Nr. 3,
S. 133–139
73
Abbildungsverzeichnis
Abbildungsverzeichnis
1.1 RNA-Strukturen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.1 Edit-Operationen auf Bäumen. . . . . . . . . . . . . . . . . . . . . . . .
2.2 Baum-Transformation. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
15
3.1
3.2
3.3
3.4
3.5
.
.
.
.
.
17
22
25
27
28
4.1 Zwei Situationen des Satzes 4.1. . . . . . . . . . . . . . . . . . . . . . .
4.2 Zerlegung eines Baumes in linkeste Pfade. . . . . . . . . . . . . . . . . .
4.3 Zerlegung eines Baumes in schwere Pfade. . . . . . . . . . . . . . . . . .
30
32
40
6.1 Edit-Operationen, Entfernung und Beschneidung von Knoten. . . . . . .
6.2 Teilstrukturen eines Baumes. . . . . . . . . . . . . . . . . . . . . . . . .
49
58
7.1 GUI Java-Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 UML-Klassendiagramm des Java-Tools. . . . . . . . . . . . . . . . . . . .
65
67
Edit-Distanz-Abbildung. . . . . . . . . . . . . . . . .
Dritter Fall der Rekursionsformel (4) des Satzes 3.4.
Ausrichtung von Bäumen. . . . . . . . . . . . . . . .
Parsebäume. . . . . . . . . . . . . . . . . . . . . . . .
Beispiel einer Baum-Inklusion. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Algorithmenverzeichnis
75
Algorithmenverzeichnis
4.1 compute_delta(v, w) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Zhang-Shasha-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Zhang-Shasha-Algorithmus für Eingaben T1 , T2 mit |L(T1 )| = 1 und
|L(T2 )| = 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1 compute_alpha(vs , vi , wt , w j ) . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Jiang-Wang-Zhang-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . .
6.1 compute_Psi(v, w) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 compute_Phi(v, w) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 Jansson-Peng-Algorithmus zum Finden einer zu T2 ähnlichsten einfachen
Teilstruktur von T1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4 Jansson-Peng-Algorithmus zum Finden einer zu T2 ähnlichsten
Geschwister-Teilstruktur von T1 . . . . . . . . . . . . . . . . . . . . . . . .
6.5 compute_delta(v, w) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.6 Jansson-Peng-Algorithmus zum Finden eines zu T2 ähnlichsten geschlossenen Teilwaldes von T1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
34
37
44
45
52
56
59
60
62
63
Erklärung der Selbstständigkeit
Hiermit versichere ich, dass ich die vorliegende Masterarbeit selbständig und ohne fremde Hilfe verfasst und keine anderen als die in der Arbeit angegebenen Quellen und
Hilfsmittel verwendet habe. Die Arbeit hat in gleicher oder ähnlicher Form noch keinem
anderen Prüfungsamt vorgelegen.
Hannover, den 04. November 2009
Gennadi Mirmov
Herunterladen