Baue-Wheeler verwandeln sich

Die Baue-Wheeler verwandeln sich (BWT, auch genannt Block sortierende Kompression), ist ein Algorithmus, der in Datenkompressionstechniken wie bzip2 verwendet ist. Es wurde von Michael Burrows und David Wheeler 1994 erfunden, während man am Systemforschungszentrum im DEZ in der Palo Altstimme, Kalifornien gearbeitet hat. Es basiert auf einer vorher unveröffentlichten Transformation, die von Wheeler 1983 entdeckt ist.

Wenn eine Charakter-Schnur durch den BWT umgestaltet wird, ändert keiner seiner Charaktere Wert. Die Transformation permutiert die Ordnung der Charaktere. Wenn die ursprüngliche Schnur mehrere Teilketten hatte, die häufig vorgekommen sind, dann wird die umgestaltete Schnur mehrere Plätze haben, wo ein einzelner Charakter mehrmals hintereinander wiederholt wird. Das ist für die Kompression nützlich, da sie dazu neigt, leicht zu sein, eine Schnur zusammenzupressen, die Läufe von wiederholten Charakteren durch Techniken wie Bewegung zur Vorderseite hat, verwandeln sich und Verschlüsselung der Lauf-Länge.

Zum Beispiel:

Die Produktion ist zur Kompresse leichter, weil es viele wiederholte Charaktere hat.

Tatsächlich, in der umgestalteten Schnur, gibt es insgesamt sechs Läufe von identischen Charakteren:

und

, die zusammen 13 aus den 44 Charakteren darin machen.

Beispiel

Das Umgestalten wird durch das Sortieren aller Folgen des Textes in der lexikografischen Ordnung, dann die Einnahme der letzten Säule getan. Zum Beispiel wird der Text "^BANANA" in "BNN^AAA" durch diese Schritte umgestaltet (der rote Charakter zeigt den 'EOF' Zeigestock an):

Der folgende Pseudocode gibt eine einfache, aber ineffiziente Weise, den BWT und sein Gegenteil zu berechnen. Es nimmt an, dass die Eingangsschnur einen speziellen Charakter 'EOF' enthält, der der letzte Charakter ist, nirgends sonst im Text vorkommt, und während des Sortierens ignoriert wird.

fungieren Sie BWT (spannen Sie s)

schaffen Sie einen Tisch, Reihen sind alle möglichen Folgen von s

Sorte-Reihen alphabetisch

kehren Sie (letzte Säule des Tisches) zurück

fungieren Sie inverseBWT (spannen Sie s)

schaffen Sie leeren Tisch

wiederholen Sie Zeiten der Länge (N)

fügen Sie s als eine Säule des Tisches vor der ersten Säule des Tisches//ein der erste Einsatz schafft die erste Säule

Sorte-Reihen des Tisches alphabetisch

kehren Sie zurück (Reihe, die mit dem 'EOF' Charakter endet)

Um zu verstehen, warum das leichter komprimierbare Daten schafft, wollen wir denken, einen langen englischen Text umzugestalten, der oft das Wort enthält. Das Sortieren der Folgen dieses Textes wird häufig Folgen gruppieren, die mit "ihm" zusammen und dem letzten Charakter dieser Folge anfangen (der auch der Charakter vor "ihm" ist), wird gewöhnlich "t" sein, so würde das Ergebnis des Umgestaltens mehrere "t" Charaktere zusammen mit vielleicht weniger - allgemeine Ausnahmen enthalten (solcher, als ob es "Brahe" enthält) gemischt darin. So kann es gesehen werden, dass sich der Erfolg davon verwandelt, hängt von einem Wert ab, der eine hohe Wahrscheinlichkeit des Auftretens vor einer Folge hat, so dass im Allgemeinen es ziemlich lange Proben (einige Kilobytes mindestens) passender Daten (wie Text) braucht.

Das bemerkenswerte Ding über den BWT besteht nicht darin, dass es eine leichter verschlüsselte Produktion erzeugt - würde eine gewöhnliche Sorte das tun - aber dass es umkehrbar ist, der Originalurkunde erlaubend, von den letzten Säulendaten regeneriert zu werden.

Das Gegenteil kann dieser Weg verstanden werden. Nehmen Sie den Endtisch im BWT Algorithmus, und löschen Sie alle außer der letzten Säule. In Anbetracht nur dieser Information können Sie die erste Säule leicht wieder aufbauen. Die letzte Säule erzählt Ihnen allen die Charaktere im Text, sortieren Sie so gerade diese Charaktere alphabetisch, um die erste Säule zu bekommen. Dann vor allen Dingen geben Säulen (jeder Reihe) Ihnen allen zusammen Paare von aufeinander folgenden Charakteren im Dokument, wo Paare zyklisch so dass die letzte und erste Charakter-Form ein Paar genommen werden. Das Sortieren der Liste von Paaren gibt die ersten und zweiten Säulen. Auf diese Weise weitermachend, können Sie die komplette Liste wieder aufbauen. Dann ist die Reihe mit dem "Ende der Datei" Charakter am Ende der ursprüngliche Text. Das Umkehren des Beispiels wird oben wie das getan:

Optimierung

Mehrere Optimierungen können diese Algorithmen geführt effizienter machen, ohne die Produktion zu ändern. In BWT gibt es kein Bedürfnis, den Tisch entweder im encoder oder in Decoder zu vertreten. Im encoder kann jede Reihe des Tisches durch einen einzelnen Zeigestock in die Schnuren vertreten werden, und die Sorte hat das Verwenden der Indizes durchgeführt. Etwas Sorge muss genommen werden, um sicherzustellen, dass die Sorte nicht ausstellt

schlechtes Grenzfall-Verhalten: Standardbibliothekssorte-Funktionen werden kaum passend sein. Im Decoder gibt es auch kein Bedürfnis, den Tisch zu versorgen, und tatsächlich ist keine Sorte überhaupt erforderlich. Rechtzeitig proportional zur Alphabet-Größe und Schnur-Länge kann die decodierte Schnur ein Charakter auf einmal vom Recht bis linken erzeugt werden. Ein "Charakter" im Algorithmus kann ein Byte, oder ein bisschen, oder jede andere günstige Größe sein.

Es gibt kein Bedürfnis, einen wirklichen 'EOF' Charakter zu haben. Statt dessen kann ein Zeigestock verwendet werden, der sich erinnert, wo in einer Schnur der 'EOF' sein würde, wenn es bestände. In dieser Annäherung muss die Produktion des BWT sowohl die umgestaltete Schnur als auch den Endwert des Zeigestocks einschließen. Das bedeutet, dass der BWT wirklich seinen Eingang ein bisschen ausbreitet. Das Gegenteil verwandelt sich dann weicht zurück es tritt zur ursprünglichen Größe zurück: Es wird eine Schnur und ein Zeigestock gegeben, und gibt gerade eine Schnur zurück.

Eine ganze Beschreibung der Algorithmen kann in Bauen und dem Papier von Wheeler, oder in mehreren Online-Quellen gefunden werden.

Bijektive Variante

Da jede Folge der Eingangsschnur zu derselben umgestalteten Schnur führen wird, kann der BWT nicht ohne umgekehrt werden

einen 'EOF' Anschreiber zum Eingang hinzufügend oder, die Produktion mit der Information, wie ein Index, vermehrend

das macht es möglich, die Eingangsschnur von der Klasse von allen seinen Folgen zu identifizieren.

Es gibt eine bijektive Version des Umgestaltens, durch der die umgestaltete Schnur

einzigartig identifiziert das Original. In dieser Version hat jede Schnur ein einzigartiges Gegenteil

derselben Länge.

Die bijektiven verwandeln sich wird durch das erste Factoring der Eingang in eine nichtzunehmende Folge von Wörtern von Lyndon geschätzt; solch ein factorization besteht durch den Lehrsatz von Chen-Fox-Lyndon, und kann in der geradlinigen Zeit gefunden werden. Dann, die Algorithmus-Sorten zusammen alle Folgen von allen diesen Wörtern; als in den üblichen Bauen-Wheeler verwandeln sich, das erzeugt eine sortierte Folge von N-Schnuren.

Die umgestaltete Schnur wird dann durch die Auswahl des Schlusszeichens von jeder dieser Schnuren in dieser sortierten Liste erhalten.

Zum Beispiel verwandelt sich Verwendung des bijektiven gibt:

Die bijektiven verwandeln sich schließt acht Läufe von identischem ein

Charaktere. Diese Läufe sind in der Ordnung:

und

.

Insgesamt, 18 Charaktere

nehmen Sie an diesen Läufen teil.

Dynamische Baue-Wheeler verwandeln sich

Anstatt die Baue-Wheeler wieder aufzubauen, verwandeln sich von einem editierten Text, Salson u. a. schlagen Sie einen Algorithmus vor, der die neuen Baue-Wheeler ableitet, verwandeln sich vom ursprünglichen, das Tun einer begrenzten Zahl der lokalen Wiedereinrichtung in den ursprünglichen Bauen-Wheeler verwandelt sich.

Beispieldurchführung

Diese Pythonschlange-Durchführung opfert Geschwindigkeit für die Einfachheit: Das Programm ist kurz, aber nimmt mehr als die geradlinige Zeit, die in einer praktischen Durchführung gewünscht würde.

Mit dem ungültigen Charakter als das Ende des Dateianschreibers, und mit, um die ith Folge zu bauen, verwandeln sich die nachschicken nimmt den letzten Charakter von jeder der sortierten Reihen:

def bwt (s):

" ""Gelten Baue-Wheeler verwandeln sich, um Schnur einzugeben. """

behaupten Sie "\0" nicht in s, "Eingangsschnur kann ungültigen Charakter ('\0')" nicht enthalten

s + = "\0" # Fügen Ende des Dateianschreibers Hinzu

Tisch = sortiert (s [ich:] + s [: i] weil ich in der Reihe (len (s))) # Tisch von Folgen der Schnur

last_column = [Reihe [-1:] für die Reihe im Tisch] # Letzte Charaktere jeder Reihe

kehren Sie "".join (last_column) # Bekehrter-Liste von Charakteren in die Schnur zurück

</Quelle>

Das Gegenteil gestaltet wiederholt Einsätze als die linke Säule des Tisches um, und sortiert den Tisch. Nachdem der ganze Tisch gebaut wird, gibt er die Reihe zurück, die mit der Null minus die Null endet.

def ibwt (r):

" ""Gelten umgekehrte Baue-Wheeler verwandeln sich. """

Tisch = [""] * len (r) # Macht leeren Tisch

weil ich in der Reihe (len (r)):

Tisch = sortiert (r [ich] + Tisch [ich] weil ich in der Reihe (len (r))) # Fügt eine Säule von r Hinzu

s = [Reihe für die Reihe im Tisch, wenn row.endswith (" \0")] [0] # die richtige Reihe Finden (in "\0" endend)

,

kehren Sie zurück s.rstrip (" \0") # werden Los, ungültigen Charakter zu schleppen

</Quelle>

Hier ist ein anderer, effizientere Methode für das Gegenteil verwandeln sich. Obwohl komplizierter, vergrößert es die Geschwindigkeit außerordentlich, wenn es lange Schnuren decodiert.

def ibwt (r, *args):

"Umgekehrte Baue-Wheeler verwandeln sich. args ist der ursprüngliche Index \

wenn es durch ein ungültiges Byte" nicht angezeigt wurde

firstCol = "".join (hat (r) sortiert)

zählen Sie = [0] *256

byteStart = [-1] *256

Produktion = [""] * len (r)

Abkürzung = [Niemand] *len (r)

#Generates verzeichnet Abkürzung

weil ich in der Reihe (len (r)):

shortcutIndex = ord (r [ich])

Abkürzung [ich] = Zählung [shortcutIndex]

Zählung [shortcutIndex] + = 1

shortcutIndex = ord (firstCol [ich])

wenn byteStart [shortcutIndex] ==-1:

byteStart [shortcutIndex] = ich

localIndex = (r.index (" \x00") wenn nicht args sonst args [0])

weil ich in der Reihe (len (r)):

#takes der folgende Index, der durch den Transformationsvektoren angezeigt ist

nextByte = r [localIndex]

Produktion [len (r)-i-1] = nextByte

shortcutIndex = ord (nextByte)

#assigns localIndex zum folgenden Index im Transformationsvektoren

localIndex = byteStart [shortcutIndex] + Abkürzung [localIndex]

kehren Sie "".join (Produktion).rstrip (" \x00") zurück

</Quelle>

BWT in bioinformatics

Das Advent von Techniken des hohen Durchflusses sequencing (HTS) am Ende des 2000-Jahrzehnte-hat zu einer anderen Anwendung der Transformation der Baue-Wheeler geführt. In HTS wird DNA in kleine Stücke gebrochen, von denen die ersten paar Basen sequenced sind, "liest" das Nachgeben von mehreren Millionen dessen, jede 30 bis 500 Grundpaare ("DNA-Charaktere") lange. In vielen Experimenten, z.B, im SPAN-SEQ, ist die Aufgabe jetzt sich auszurichten diese lesen zu einem Bezugsgenom, d. h., zum bekannten, fast ganze Folge des fraglichen Organismus (der bis zu mehrere Milliarden Grundpaare lange sein kann). Mehrere Anordnungsprogramme, die für diese Aufgabe spezialisiert sind, wurden veröffentlicht, der sich am Anfang auf hashing (z.B, Elenantilope, SEIFE oder Maq) verlassen hat. Um die Speichervoraussetzung für die Folge-Anordnung zu reduzieren, wurden mehrere Anordnungsprogramme entwickelt (Frackschleife, BWA und SOAP2), die die Baue-Wheeler verwenden, verwandeln sich.

Links


Jimmy Shea / Heiliger Matthias
Impressum & Datenschutz