Burrows-Wheeler-Transformation (BWT)

Beobachte, wie zyklische Rotationen in eine Matrix sortiert werden, deren letzte Spalte wiederholte Zeichen bündelt — und kehre die Transformation dann verlustfrei um

Interaktive Simulation wird geladen...

warum das Sortieren von Rotationen Runs erzeugt 🖖

Sortierst du alle zyklischen Rotationen eines Texts, landen alle Rotationen mit demselben Suffix nebeneinander. Die letzte Spalte — das Zeichen direkt vor jedem sortierten Präfix — sammelt Zeichen, die im Originaltext alle demselben Kontext vorausgingen. Wiederholte Muster bedeuten, dass viele Rotationen ein gemeinsames Suffix teilen, sodass dasselbe vorausgehende Zeichen viele Male hintereinander in der letzten Spalte erscheint. Genau diese Runs nutzen RLE und Move-to-Front-Codierung aus. Die Transformation ist verlustfrei, weil die erste Spalte F (sortierte BWT) und die letzte Spalte L (die BWT selbst) zusammen eine vollständige Zuordnung — das LF-Mapping — codieren, mit der du den Originaltext allein aus diesen beiden Spalten und dem Key Zeichen für Zeichen rekonstruieren kannst.

BWT ordnet um, es verkleinert nicht 🖖

Für sich genommen verkleinert die BWT einen Text nicht: Die Ausgabe hat exakt dieselbe Länge und enthält dieselben Zeichen, nur anders angeordnet. Sie bereitet den Text reversibel auf, indem sie gleiche Zeichen bündelt. Nachfolgende Kompressoren wie die Move-to-Front-Transformation, die Lauflängencodierung und anschließend die Huffman- oder arithmetische Codierung können das besonders gut ausnutzen. Bei "abracadabra$" besteht die Ausgabe aus denselben zwölf Zeichen; vier a stehen nun direkt hintereinander, obwohl in der Eingabe nie zwei benachbart waren.

Derselbe Trick, der deine DNA kartiert 🖖

Eine Kompressionsidee wurde still und leise zu einem Eckpfeiler der Genomik. Verpackt in eine Struktur namens FM-Index erlaubt die BWT, ein kurzes DNA-Fragment in einem 3 Milliarden Buchstaben langen menschlichen Genom zu suchen, während dieses Genom nur wenige Gigabyte belegt. Aligner wie Bowtie und BWA — der Burrows-Wheeler Aligner — bauen darauf auf, sodass ein Kompressionstrick von 1994 heute den täglichen Abgleich von Millionen Sequenzierungs-Reads trägt.

Aufgabe vollständig gelöst

  1. Die Burrows-Wheeler-Transformation von "banana$" mit allen sieben sortierten Rotationen 5 Schritte

    Bestimmen Sie die Burrows-Wheeler-Transformation von "banana$" und entscheiden Sie anschließend, ob etwas komprimiert wurde. Dies ist der Schritt BWT-Ausgabe: Sentinel-Zeichen angehängt, alle sieben Rotationen sortiert, letzte Spalte abgelesen.

    1. Das Sentinel-Zeichen wird angehängt, bevor irgendetwas anderes geschieht. Da $ vor jedem Buchstaben einsortiert wird und genau einmal vorkommt, können zwei Rotationen niemals als gleich verglichen werden, sodass die Sortierung ein einziges, eindeutiges Ergebnis hat.

    2. Die lexikographische Sortierung der Rotationen ist die einzige Arbeit, die die Transformation verrichtet. Liest man die sieben Zeilen von oben nach unten, fällt auf, dass die Sortierung die Zeichenkette danach gruppiert hat, was nach der jeweiligen Position steht.

    3. Das letzte Zeichen einer Rotation ist das Zeichen, das im Original unmittelbar vor ihrem ersten Zeichen steht. Deshalb erzeugt die Sortierung Läufe: Die Zeilen 1 und 2 beginnen beide mit 'a' und enden beide mit 'n', da beiden dieser a's ein n in banana vorausgeht. Der Schlüssel ist die Zeilennummer des Originals, und ohne ihn kann die Transformation nicht rückgängig gemacht werden.

    4. Bisher wurde nichts komprimiert, und es hätte auch nichts komprimiert werden können — die Ausgabe ist eine Permutation der Eingabe, dieselben sieben Zeichen in einer anderen Reihenfolge. Was sich geändert hat, ist die Laufstruktur, und das ist das Einzige, was sich geändert hat.

    5. RLE berechnet zwei Byte pro Lauf, sodass fünf Läufe zehn Byte gegenüber einer Sieben-Byte-Eingabe kosten. Die Schwelle zur Rentabilität verschiebt sich nie: Die Anzahl der Läufe muss unter der Hälfte der Länge liegen, was hier drei oder weniger bedeutet.

    Antwort

    Das Bedienfeld zeigt annb$aa mit key = 4, eine durchschnittliche Lauflänge von 1,4 Zeichen, 10 Byte RLE und einen Wert von 0,70× an. Die Transformation hat genau das getan, was sie verspricht — sie hat die durchschnittliche Lauflänge um 40% gesteigert, ohne ein einziges Zeichen anzurühren —, und dennoch hat die Pipeline verloren, da sieben Zeichen nicht genug Text sind, damit dieser Gewinn zwei Byte pro Lauf deckt. Verdoppelt man das Wort, kippt die Rechnung. "bananabanana$" hat dreizehn Zeichen und seine Transformation lautet annnnbba$aaaa: sechs Läufe statt fünf, während sich die Länge nahezu verdoppelt hat, was 12 Byte gegenüber 13 und einen Wert von 1,08× ergibt. Das ist das entscheidende Argument für die BWT — die Anzahl der Läufe wird davon bestimmt, wie viele verschiedene Kontexte der Text hat, nicht davon, wie lang er ist. Je länger der Block ist, desto mehr zahlt sie sich aus, weshalb bzip2 Blöcke von bis zu 900 kB statt einzelner Wörter transformiert.

Lernpfad

Kompression von Hand

Quellen (3)

Beispielaufgaben

  • banana - Aus "banana$" wird "annb$aa": Die drei zuvor nie benachbarten a bilden jetzt zwei Gruppen, und die Anzahl der Läufe sinkt von 7 auf 5.
  • mississippi - Aus "mississippi$" wird "ipssm$pissii": Das klassische Lehrbuchbeispiel. Bei dieser kurzen Zeichenfolge bleibt die Anzahl der Läufe mit 9 unverändert. Erst bei längeren Texten zahlt sich die Bündelung durch die BWT aus.
  • abracadabra - Aus "abracadabra$" wird "ard$rcaaaabb": Vier a stehen hintereinander, obwohl im Original nie zwei benachbart waren; die Anzahl der Läufe sinkt von 12 auf 8. Von den vier Vorgaben werden die Zeichen hier am stärksten gebündelt.
  • DNA-Sequenz - Aus "AGATCAGA$" wird "AGC$GTAAA": Drei A stehen nun beieinander, obwohl zuvor keine benachbart waren. Bei einem Genom ist dies die Struktur, auf der ein FM-Index aufbaut.