\usepackage[utf8]{inputenc}% LaTeX source encoded as UTF-8
\usepackage{graphicx}%graphics files inclusion
\usepackage{algorithm2e}
\usepackage[]{algorithm2e}
% \usepackage{amsmath} %advanced maths
% \usepackage{amssymb} %additional math symbols
...
...
@@ -114,12 +114,16 @@ Tato kapitola pojednává přímo o jednotlivých metodách. O tom na jakém pri
\subsection{Popis}
Tento kompresní algoritmus vynalezli v roce 1977 pánové Abraham Lempel a Jakob Ziv. Jedná se o slovníkovou a bezztrátovou metodu. Je založena na principu klouzavého okénka (floating window), které si lze představit jako vyříznutou část dat. Při běhu programu se okénko posouvá v datech pouze jedním směrem a to od začátku do konce. Je rozděleno na dvě části - prohlížecí okénko (search buffer) a aktuální okénko (look-ahead buffer). Jejich velikost je velmi zásadní pro efektivitu celého algoritmu. V zásadě se dá řict, že velikost prohlížecího okénka musí být vždy větší nebo rovna velikosti aktuálního okénka, nicméně v praxi je prohlížecí okénko obvykle tisíci násobně větší než aktuální.\cite{vohoLZ77}
\subsection{Algoritmus}
Tento kompresní algoritmus vynalezli v roce 1977 pánové Abraham Lempel a Jakob Ziv. Jedná se o slovníkovou a bezztrátovou metodu. Je založena na principu klouzavého okénka (floating window), které si lze představit jako vyříznutou část dat. Při běhu programu se okénko posouvá v datech pouze jedním směrem a to od začátku do konce. Je rozděleno na dvě části - prohlížecí okénko (search buffer) a aktuální okénko (look-ahead buffer).
Hlavní myšlenka tohoto algoritmu spočívá v nalenzení co nejdelšího prefixu z nezakódovaných dat, který je zároveň obsažený i v prohlížecím okénku. Tato metoda umožňuje menší vylepšení efektivity, pokud se při vyhledávání neomezím pouze na prohlížecí okénko, ale pouze na podmínku, že prefix v něm musí začínat. V některých případech je možné nalezt nejdelší prefix, který přesahuje do aktualního okénka, zakoduji tedy větší část dat. Slovník této metody je tvořen všemi podřetězci, které začínají v prohlížecím okénku.
Zde je jednoduchý pseudokód, který popisuje tuto metodu:
\IncMargin{1em}
\begin{algorithm}[H]
vyhledávací a aktualní okénko jsou prázdná\;
prohlížecí a aktualní okénko jsou prázdná\;
\While{na vstupu jsou data}{
přidej na konec aktualního okénka symbol ze vstupu\;
najdi ve vyhledávacím okénku nejdelší možný prefix p z aktualního okénka\;
najdi prefix p z aktualního okénka, který začíná v prohlížecím okénku\;
\eIf{p existuje}{
zapiš trojici (i, j, k), kde i je vzdálenost prvního znaku nalezeného p od začátku aktualního okénka, j je délka p a k je první nasledující symbol po p\;
posun klouzavé okénko o j+1\;
...
...
@@ -129,14 +133,37 @@ Tento kompresní algoritmus vynalezli v roce 1977 pánové Abraham Lempel a Jako
}
}
\caption{Pseudokód metody LZ77}
\end{algorithm}
\end{algorithm}\DecMargin{1em}
\subsection{Složitost komprese}
Dle mého názoru je složitost tohoto algoritmu $O(nm)$.
Na první pohled není uplně zřejmé, jak jsem k tomuto závěru došel. Rozhodl jsem se tedy své tvrzení dokázat pomocí matematického důkazu. Mějme asymptotickou složitost znázorněnou sumou, která vyjadřuje nejvyšší možný počet operací potřebných pro komprimaci souboru:
$$O(\sum_{n=1}^{P} m p_{n})$$
kde $P$ je množina všech prefixů nalezených v datech, $m$ je velikost prohlížecího okénka a $p_{n}$ velikost $n$-tého prefixu z $P$.
Protože součet sumy nezáleží na $ m $, mohu ho vytknout před sumu:
$$O(m\sum_{n=1}^{P}p_{n})$$
Součet sumy je vždy rovný velikosti dat, protože procházím celá vstupní data a rozděluji je na podřetězce, které najdu v prohlížecím okénku. Nezáleží tedy na délce jednotlivých podřetězců, jejich součet velikostí bude vždy roven velikosti vstupních dat, tedy $ n $. Proto:
$$O(\sum_{n=1}^{P} m p_{n})= O(mn)$$
Je třeba říci, že na vyhledání prefixu nebude vždy potřeba stejný počet operací, proto jsem se rozhodl použít tzv. omikron $ O $, který složitost omezuje shora.
\subsection{Výhody}
\begin{itemize}
\item\textbf{Paměť} -- Díky posuvnému okénu se zpracovává vždy pouze poměrně malá čast dat, proto neroste paměťová náročnost s velikost vstupu.
\item\textbf{Rychlost dekomprese} -- Při vhodně zvolené implementaci je algoritmus dekomprese lineárně závislý pouze na velikosti dat. Jeho složitost je tedy $\Theta(n)$, kde n je velikost dekomprimovaných dat.
\end{itemize}
\subsection{Nevýhody}
\begin{itemize}
\item\textbf{Paměť} -- Díky posuvnému okénu se zpracovává vždy pouze malá čast dat, proto neroste paměťová náročnost s velikost vstupu.
\item\textbf{Rychlost komprese} -- Složitost $O(nm)$ je vůči dekompresi $ m $ krát větší. To znamená, že algoritmus bude pomalejší, protože $ m $ je obvykle velké číslo v řádech tisíců až desetitisíců.