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

complexity of lz77

parent 2a38c6d9
No related branches found
No related tags found
No related merge requests found
No preview for this file type
......@@ -15,7 +15,7 @@
\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ů.
\end{itemize}
\chapter{Realizace}
 
\chapter{Testovaní}
......
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