Burrows-Wheelertransformatie

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

De Burrows-Wheelertransformatie (hieronder ook afgekort als BWT) is een transformatie van een tekenreeks naar een vorm waarin deze gemakkelijker te comprimeren is. De bekendste toepassing van de Burrows-Wheelertransformatie is het programma bzip2.

De Burrows-Wheelertransformatie verandert de volgorde van de tekens in een tekenreeks, de tekens zelf blijven ongewijzigd. Na de BWT zullen veel tekens aaneengesloten naast elkaar zitten, zodat bijvoorbeeld het RLE-algoritme beter toegepast kan worden. Om een goede compressie te bereiken, moet de tekenreeks minimaal enkele kilobytes omvatten.

De Burrows-Wheelertransformatie werd uitgevonden in 1983 door David Wheeler en gepubliceerd door M. Burrows en David Wheeler in 1994.

Algoritme[bewerken]

Stel, we hebben een tekenreeks in het alfabet [a-z]* zijnde "sinaasappel". Om een BWT toe te passen, schrijven we het woord iedere keer één positie geroteerd onder elkaar:


sinaasappel
inaasappels
naasappelsi
aasappelsin
asappelsina
sappelsinaa
appelsinaas
ppelsinaasa
pelsinaasap
elsinaasapp
lsinaasappe

Vervolgens sorteren we de 11 tekenreeksen die we nu hebben. Sorteren op alfabet ligt voor de hand, dus dat doen we hier, maar het maakt in principe niet uit, als we straks bij het ongedaan maken maar dezelfde sortering gebruiken:

aasappelsin
appelsinaas
asappelsina
elsinaasapp
inaasappels
lsinaasappe
naasappelsi
pelsinaasap
ppelsinaasa
sappelsinaa
sinaasappel

De eerste kolom in deze gesorteerde matrix noemen we F, de laatste kolom L. De Burrows-Wheelertransformatie van een reeks tekens bestaat uit de kolom L, plus de verticale positie van de oorspronkelijke tekst in de matrix, in ons geval toevallig positie 11. De BWT van onze tekenreeks is dan ook:

11
nsapseipaal

Het opmerkelijke van de Burrows-Wheelertransformatie is dat hij omkeerbaar is; het ongedaan maken van een sortering is op zijn zachtst gezegd opmerkelijk. Toch lukt dit.

Merk op dat als je L weet, je F kunt verkrijgen door L te sorteren. Uit deze twee tekenreeksen kunnen we een transformatievector T afleiden; we kijken voor ieder teken in L op welke positie deze in F voorkomt:


L F T
n
s
a
p
s
e
i
p
a
a
l
a
a
a
e
i
l
n
p
p
s
s
7
10
1
8
11
4
5
9
2
3
6

We kunnen nu de oorspronkelijke tekenreeks terughalen door als volgt te werken:

  • We beginnen met de index van de BWT (dat was de positie van de oorspronkelijke tekst in de gesorteerde matrix). Dat was in dit geval een 11.
  • Het 11e teken van L is een l. We kijken op positie 11 in T. Daar staat een 6.
  • Het 6e teken van L is een e. Op positie 6 in T staat een 4.
  • Het 4e teken van L is een p. Op positie 4 in T staat een 8.
  • Het 8e teken van L is een p. Op positie 8 in T staat een 9.
  • Het 9e teken van L is een a. Op positie 9 in T staat een 2.
  • Het 2e teken van L is een s. Op positie 2 in T staat een 10.
  • Het 10e teken van L is een a. Op positie 10 in T staat een 3.
  • Het 3e teken van L is een a. Op positie 3 in T staat een 1.
  • Het 1e teken van L is een n. Op positie 1 in T staat een 7.
  • Het 7e teken van L is een i. Op positie 7 in T staat een 5.
  • Het 5e teken van L is een s. Op positie 5 in T staat een 11. We stoppen omdat de 11 gelijk is aan de index waarmee we zijn begonnen.

Na het omkeren van ons voorlopig resultaat (nl. "leppasaanis"), krijgen we onze oorspronkelijke tekenreeks "sinaasappel".


Werkingsprincipe[bewerken]

Het doel van BWT is om de tekst zodanig om te werken, dat je veel herhalingen van letters krijgt. De getransformeerde tekst is nog steeds even lang als de oorspronkelijke, maar is wel gemakkelijker te comprimeren. Bepaalde compressiealgoritmes werken namelijk beter op teksten met veel herhalingen van letters.

Het werken van BWT berust op het feit dat in een natuurlijke taal bepaalde lettercombinaties vaker voorkomen dan andere. Door de transformatie worden de letters gesorteerd op basis van de letterreeks die er op volgt. Bijvoorbeeld, de i in sinaasappel wordt gesorteerd op basis van de letterreeks "naasap...". Zo wordt in het Nederlands de 'c' vaak gevolgd door een 'h'. Dus de letters 'c' in een Nederlandse tekst zullen na een BWT tranformatie vaak achter elkaar staan. Hoe langer de tekst, des te sterker het effect. Als in een publicatie van de bond van groentehandelaren het woord 'sinaasappel' 10x voorkomt, vind je in de getransformeerde tekst alle s-en van dat woord achter elkaar.

Externe links[bewerken]