Skip to content
Snippets Groups Projects
Commit 8d520683 authored by Ladislav Zemek's avatar Ladislav Zemek
Browse files

triplets

parent c7377b2c
No related branches found
No related tags found
No related merge requests found
No preview for this file type
......@@ -386,12 +386,13 @@ Uvnitř metody se pak volá třídní metoda consumera \classname{accept}, kter
\section{Načítání a zápis do souboru}
Načítání ze souboru se u komprese a dekomprese liší. Zatím co v prvním případě, načítám ze souboru byty u dekomprese se jedná o načtení celého objektu ze souboru. Je tomu tak proto, že po kompresi se ukládá celé pole bytů jako objekt, aby bylo možné načítat uložené triplety. Dekomprese ukládá data do souboru po bytech, aby byl soubor stejný jako před komprimací.
 
O vše se stará třída \classname{FileIO}, která má jako parametr velikost, podle které rozděluje načítaný soubor na menší části a ty se následně zkomprimují a v podobě tripletů uloží do souboru. Zkomprimované soubory se načítají i dekomprimují jako celek, aby nedocházelo k narušení algoritmů, tak že načteme menší nebo větší část tripletů než jaká byla vytvořena z jedné části pri kompresi. Slovník další části by pak nevypadal stejně jako u komprese a došlo by k chybě.
O vše se stará třída \classname{FileIO}, která má jako parametr velikost, podle které rozděluje načítaný soubor na menší části a ty se následně zkomprimují a v podobě tripletů uloží do souboru. Zkomprimované soubory se načítají i dekomprimují jako celek, aby nedocházelo k narušení slovníků. Mohlo by se stát, že načteme menší nebo větší část tripletů než jaká byla vytvořena z jedné části pri kompresi. Takový případ by pak vedl k sestavení špatného slovníku, což by vedlo k chybám v dekompresi.
\section{Triplety}
 
Nedílnou součástí všech implementovaných kompresních metod jsou triplety. Jejich spracování a následný zápis je sprostředkován pomocí rozhraní \classname{TripletSupplier}, které se vždy používá jen pro vytvoření anonymní vnitřní trídy, která implementuje metodu visit, jejímž parametrem je \classname{TripletProcessor}. Ten dokáže pomocí metody \classname{write} zapsat jednotlivé části tripletu do souboru. Zde je ukázka kódu:
Nedílnou součástí všech implementovaných kompresních metod jsou triplety. Jejich spracování a následný zápis je sprostředkován pomocí rozhraní\newline \classname{TripletSupplier}, které se vždy používá jen pro vytvoření anonymní vnitřní trídy, která implementuje metodu visit, jejímž parametrem je \classname{TripletProcessor}. Ten dokáže pomocí metody \classname{write} zapsat jednotlivé části tripletu do souboru.\newpage Zde je ukázka kódu:
 
\newpage
 
\begin{lstlisting}
output.accept((TripletSupplier) new TripletSupplier() {
......@@ -403,7 +404,9 @@ output.accept((TripletSupplier) new TripletSupplier() {
});
\end{lstlisting}
 
Metoda \classname{write} má dva parametry, první popisuje vlastnosti jednotlivých složek tripletu a je reprezentovaný třídou \classname{TripletFieldId}. Druhý je samotná zapisovaná hodnota.
Metoda \classname{write} má dva parametry. Druhým parametrem je je hodnota zapisované složky tripletu. Prvním je objekt reprezentovaný třídou \classname{TripletFieldId}, který popisuje, kolik bitů má zapisovaná hodnota. \classname{TripletProcessor} se postará o správný zápis bitů. To je velká výhoda, protože u všech metod vždy dopředu vím, jaké největší číslo může být zapsáno.
Například, pokud metoda pracuje se slovníkem, jehož maximálně počet frází je $ 2^{10}$. Není potřeba zapisovat indexy jako integer, který má 32 bitů. Pro zapsání jakéhokoliv indexu je potřeba nejvýše 11 bitů, zbytek jsou redundantní data. Tento postup v tomto případě ušetří na každém tripletu 22 bitů, což je velká úspora paměti, která výrazně zlepší kompresní poměr. Samotná implementace třídy \classname{TripletFieldId} umožnuje zapsat pouze číslo o velikosti 28 bitů. Tato skutečnost ale není omezující, protože slovník s takovým počtem frází ($ 2^{29} $ a více) by byl velmi neefektivní.
 
\section{Realizace LZ77}
\section{Realizace LZ78}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment