Popis algoritmu

Algoritmus ACB při kompresi i dekompresi udržuje tři datové struktury:

1. Komprese

Uvažujme případ, kdy chceme zkomprimovat vstupní text where no one has gone before. Po zpracování 7 počátečních znaků vstupu nechť máme následující situaci:

Položky slovníku tedy obsahují vždy ty znaky, které byly v předchozích krocích algoritmu obsaženy v search bufferu (tato část se nazývá kontext), jsou setříděny podle této části lexikograficky zprava doleva a jsou doplněny o ty znaky, které jsou aktuálně v search bufferu navíc oproti zaznamenané dřívější situaci (této přidané části se říká content).

Při zpracovávání 8. znaku (o) se nejprve najde pozice ve slovníku, kam by se zatřídil (opět při lexikografickém třídení zprava doleva) aktuální obsah search bufferu. Označme tuto pozici a.

Dále se najde pozice ve slovníku, jejíž contentová část se nejvíce shoduje s aktuálním obsahem look-ahead bufferu (tj. najde se index toho contentu, který se shoduje při běžném porovnávání zleva doprava v co nejvíce po sobě jdoucích znacích s look-ahead bufferem). Označme pozici nejlepší shody b, délku této shody m a hodnotu prvního neshodujícího se znaku n (pokud se daný content s look-ahead bufferem shoduje zcela, zakóduje se n jako prázdný znak).

Výstupem kroku algoritmu je trojice [(s)d, m, n], kde d je vzdálenost indexů a a b, s je znaménko rozdílu a a b, m a n jsou hodnoty definované výše.

Krok algoritmu končí úpravou datových struktur: m+1 znaků (resp. jen m znaků, je-li n prázdný) se přesune ze začátku look-ahead bufferu na konec search bufferu (tyto znaky již byly zkomprimovány) a při přesouvání každého znaku se do slovníku zatřídí (lexikograficky zprava doleva podle kontextové části) aktuální obsah search bufferu a doplní se contentové části o daný znak.

1.2 Inicializace

Kompresní algoritmus se inicializuje tím, že první znak c vstupních dat se fixně zakóduje jako trojice [0, 0, c] a zařadí se do search bufferu, slovník zůstává prázdný. Zpracování druhého znaku již probíhá podle výše uvedeného postupu a invarianty zůstávají zachovány.

2. Dekomprese

Je snadné nahlédnout, že při dekompresi, která je inicializována vložením prvního znaku c do search bufferu, můžeme v libovolném kroku při stejném přidávání záznamů jako během komprese najít index ve slovníku, kam by se měl lexikograficky zprava doleva zařadit aktuální search buffer, protoze kontextové části slovníku obsahují jen znaky, které již byly v search bufferu dříve a jsou tedy již známy. Obsah look-ahead bufferu je sice při dekompresi neznámý, to ovšem nevadí.

V každém kroku dekomprese přečteme ze vstupu trojici [(s)d, m, n], vypočítáme index kontextové shody a jako při kompresi a ze znalosti (s)d (rozdíl mezi indexem kontextové a contentové shody) můžeme vypočítat hodnotu b (index contentové shody).

Nyní již ovšem víme, že znaky zkomprimované trojicí [(s)d, m, n] odpovídají prvním m znakům v contentové části slovníku na indexu b a další znak, který následuje, je n (je-li neprázdný). Můžeme tyto znaky tedy přidat do search bufferu a pro každý znak zatřídit do slovníku aktuální obsah search bufferu a doplnit contentové části (zcela analogicky jako při kompresi).