Burrows-Wheelerova transformace
Základní informace
- Hlavní využití má zejména při zpracování obrázků, hudby a textu.
- Oproti jiným metodám pracuje v blokovém režimu, proto ji lze najít i pod názvem block-sorting.
- Je použita v kompresním algoritmu bzip2.
Časová a paměťová složitost algoritmu
Časová složitost třídění je O(n.log(n)). Při použití metody Suffix Array O(n).
Historie
Metoda byla navržena Michaelem Burrowsem a Davidem Wheelerem, 1994.
Popis
Burrows-Wheelerova transformace pracuje v blokovém režimu. Čteme tedy ze vstupu bloky textu o předem definované velikosti a každý zpracováváme samostatně.
Nejprve provedeme všechny cyklické rotace vstupního textu (zde vlevo), které očíslujeme. Výsledné fráze potom lexikograficky seřadíme a zapamatujeme si číslo řádku, na kterém je původní řetězec vstupního textu. Ze všech lexikograficky seřazených frází vybereme postupně poslední znak a sestavíme řetězec L, resp. vybereme poslední sloupec (L = Last) máme-li fráze sepsány od sebou.
Při kódování dále aplikujeme na řetězec L postupně metody Move To Front a Huffmanovo kódování. Dále lze ještě aplikovat metodu RLE, apod. Při dekódování použijeme metody v opačném pořadí a získáme zpět řetězec L a hodnotu I.
Dekódování názorně provedeme tak, že řetězec L sepíšeme do sloupce a očíslujeme jednotlivé symboly. Dále vytvoříme sloupce F (First) a T.
Ze sloupce L postupně vybíráme vždy nezpracovaný, lexikograficky nejmenší a v pořadí první symbol L[i]. Umístíme jej na první volnou pozici ve sloupci F a do sloupce T na pozici T[i] zaznamenáme číslo jeho pozice ve sloupci F. To provedeme postupně pro všechny symboly z řetězce L.
V dalším kroku nastavíme index řádku i na hodnotu I. Pak symbol L[i] umístíme na začátek výstupního řetězce a předjdeme na řádek s indexem T[i], to opakujeme dokud je délka výstupního řetězce menší než délka řetězce L, resp. dokud není index řádku i znovu roven hodnotě I.
Pseudokód
1: kodovani :
2: begin
3: provedeme vsechny cyklicke rotace vstupu (fraze zacina zvyraznenym symbolem)
4: ziskane fraze ocislujeme
5: fraze lexikograficky seradime s vyuzitim suffix array SA a zaznamename koncove
6: symboly jednotlivych frazi L[i]
7: zapamatujeme si na kolikate pozici je vstupni fraze I po setrideni
8: retezec L nyni zakodujeme metodou Move To Front nad abecedou A
9: vystupem metody Move To Front je posloupnost cisel C
10: urcime cetnosti vyskytu N cisel v posloupnosti C
11: cislum priradime kodova slova pomoci Huffmanova kodovani
12: output(vse Fibonacciho kodem radu 2 - hodnotu I)
13: output(pocet cisel (symbolu) v Huffmanove strome)
14: output(vsechna kodovana cisla)
15: output(Huffmanuv strom)
16: output(posloupnost C)
17: end
18:
19: dekodovani :
20: begin
21: precteme hodnotu I
22: cteme pocet kodovanych cisel v Huffmanove strome
23: cteme kodovana cisla
24: zrekonstruujeme kodova slova Huffmanova kodovani
25: dekodujeme puvodni posloupnost C
26: metodou Move To Front zpetne ziskame retezec L
27: sepiseme sloupec L (Last) a ocislujeme radky
28: while (mame nezpracovane symboly v L) do
29: begin
30: z L vybereme lexikograficky serazeno v poradi prvni nezpracovany symbol L[i]
31: vlozime ho na nasledujici volnou pozici ve sloupci F (First) a v T[i] ulozime
32: jeho index ve sloupci F
33: end
34: vybereme radek i = I
35: while (delka vystupu < delka retezce L) do
36: begin
37: symbol L[i] dame na zacatek vystupniho retezce
38: v dalsim kroku budeme zpracovavat radek s indexem T[i]
39: end
40: end
Odkazy
- M. Burrows and D. Wheeler: A block sorting lossless data compression algorithm. Technical Report 124, Digital Equipment Corporation, 1994.
- Burrows-Wheeler Transform. Wikipedia, the free encyclopedia.