Um alle Funktionen dieser Seite zu nutzen, aktivieren Sie bitte die Cookies in Ihrem Browser.
my.bionity.com
Mit einem my.bionity.com-Account haben Sie immer alles im Überblick - und können sich Ihre eigene Website und Ihren individuellen Newsletter konfigurieren.
- Meine Merkliste
- Meine gespeicherte Suche
- Meine gespeicherten Themen
- Meine Newsletter
Hirschberg-AlgorithmusDer Hirschberg-Algorithmus ist ein Algorithmus der Informatik zum finden einer bestmöglichen Überdeckung zweier Zeichenketten (Sequenzalignment) welcher auf Dan Hirschberg zurückgeht. Hierbei wird versucht die Zeichenkette zu ermitteln, welche den beiden Ausgangszeichenketten am ähnlichsten ist. Weiteres empfehlenswertes FachwissenAllgemeinesDer Hirschberg-Algorithmus ist ein allgemein einsetzbarer und optimaler Algorithmus zum Auffinden eines Sequenzalignment. Der bekannte BLAST-Algorithmus und der FASTA-Algorithmus sind nur suboptimale Heuristiken. Vergleicht man den Hirschberg-Algorithmus mit dem Needleman-Wunsch-Algorithmus, so handelt es sich beim Hirschberg-Algorithmus weniger um einen komplett neuen Algorithmus, sondern eher um eine clevere Strategie, die den Needleman-Wunsch-Algorithmus geschickt einsetzt, um den Speicherverbrauch zu linearisieren, was auch das Besondere an diesem Algorithmus ist: Die Berechnungen für ein Sequenzalignment benötigen nur linear viel Speicherplatz, womit die Platzkomplexität des Algorithmus in O(n) liegt. Zur Berechnung eines Alignments zweier Zeichenketten x und y mit m = | x | und n = | y | besitzt der Algorithmus eine Laufzeit von Θ(mn) und einen Speicherverbrauch von Θ(min{m,n}). Anwendung findet der Algorithmus zum Beispiel in der Bioinformatik zum Abgleich verschiedener DNA- oder Proteinsequenzen. Berechnung der Levenshtein-Distanz auf linearem SpeicherplatzZum Verständnis des Hirschberg-Algorithmus ist es zunächst wichtig zu verstehen, dass sich die Levenshtein-Distanz auf linearem Speicherplatz berechnen lässt: 01 T0 := 0 02 for j in 1..n loop 03 Tj := Tj − 1 + Ins(yj) 04 end loop 05 for i in 1..m loop 06 s := T0 07 T0 := T0 + Del(xi) 08 c := T0 09 for j in 1..n loop 10 c := In den Zeilen 1-4 wird das eindimensionale Feld T initialisiert. In Zeile 6 wird die Initialisierung des ersten Elements T0 in s gerettet. Danach wird T0 und c mit dem Startwert für die nächste Zeile initialisiert. Die nachfolgende Abbildung zeigt eine Momentaufnahme eines Zeilendurchlaufs. In der inneren Schleife zeigt c immer auf das jeweils zuvor berechnete Ergebnis, während s das noch benötigte Ergebnis der letzten Zeile sichert. Nach Zeile 14 steht die Levenshtein-Distanz als Ergebnis in Tn. ε y1 y2 y3 y4 ... ε 0 1 2 3 ... x1 1 x2 ... s = 0 c = T0 = 1 Es sollte klar sein, dass sich diese Berechnung auch rückwärts durchführen lässt. Dabei wird die gedachte Matrix nicht von links nach rechts und von oben nach unten durchlaufen, sondern von rechts unten nach links oben: 01 Tn := 0 02 for j in n-1..0 loop 03 Tj := Tj + 1 + Ins(yj + 1) 04 end loop 05 for i in m-1..0 loop 06 s := Tn 07 Tn := Tn + Del(xi + 1) 08 c := Tn 09 for j in n-1..0 loop 10 c := Berechnung des Alignments auf linearem SpeicherplatzDer Divide & Conquer-Algorithmus von Hirschberg berechnet ein Alignment der Zeichenketten | x | und | y | , indem er Vorwärts- und Rückwärtsdurchlauf miteinander kombiniert (Zeilenangaben beziehen sich auf den nachfolgend angegebenen Pseudocode): 1. Wenn | x | = 1 oder | y | = 1 liegt ein triviales Alignment-Problem vor (Zeilen 14 - 22). Ein String bestehend aus nur einem Zeichen muss auf einen anderen String ausgerichtet werden und ein Alignment wird zurückgegeben. Ist | x | > 1 und | y | > 1 geht man über zu Schritt 2. 2. Ein Vorwärtsdurchlauf berechnet ein Alignment von y und der ersten Hälfte von x (Zeilen 27 - 40). Das Ergebnis des Vorwärtsdurchlaufs ist ein Feld 3. Ein Rückwärtsdurchlauf berechnet ein Alignment von y mit der zweiten Hälfte von x (Zeilen 42 - 55). Das Ergebnis ist ein weiteres Feld Tr, dessen Elemente die Kosten für einen Durchlauf von (n,m) zurück zu ( | x | / 2,j) angeben. 4. In den Feldelementen 5. Die Levenshtein-Distanz von x zu y kann nun errechnet werden, indem man entlang der mittleren Zeile der Alignment-Matrix läuft und nach einer kleinsten Summe von korrespondierenden 6. Schritt 1 wird rekursiv auf den beiden Teilen von x und y aufgerufen. Die beiden rekursiven Aufrufe geben Teil-Alignments zurück, die zu einem einzigen Alignment verknüpft werden. Das Alignment wird zurückgegeben (Zeilen 68 und 69). 01 -- 02 -- Der Divide & Conquer-Algorithmus von Hirschberg zur 03 -- Berechnung des globalen Alignments auf linearem Speicher. 04 -- 05 -- Bei m = | x | ,n = | y | ,n < m besitzt der Algorithmus eine Laufzeit von Θ(nm) 06 -- und einen Speicherverbrauch von Θ(min{n,m}). 07 -- 08 function HirschbergAlignment(x,y : string) return A is 09 function SubAlignment(i1,j1,i2,j2 : integer) return A is 10 mitte,cut : integer 11 s,c : real 12 |
Dieser Artikel basiert auf dem Artikel Hirschberg-Algorithmus aus der freien Enzyklopädie Wikipedia und steht unter der GNU-Lizenz für freie Dokumentation. In der Wikipedia ist eine Liste der Autoren verfügbar. |