DIPLOMOVÁ PRÁCE. Petr Uzel Entropické kodéry

Rozměr: px
Začít zobrazení ze stránky:

Download "DIPLOMOVÁ PRÁCE. Petr Uzel Entropické kodéry"

Transkript

1 Univerzita Karlova v Praze Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE Petr Uzel Entropické kodéry Katedra softwarového inženýrství Vedoucí diplomové práce: Mgr. Jan Lánský, Ph.D. Studijní program: Informatika, Softwarové systémy 2009

2 Rád bych na tomto místě poděkoval vedoucímu diplomové práce Mgr. Janu Lánskému za cenné připomínky a ochotu, kterou mi při psaní této práce věnoval. Prohlašuji, že jsem svou diplomovou práci napsal samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce a jejím zveřejněním. V Praze dne Petr Uzel 2

3 Obsah 1 Úvod 7 2 XBW Parser Komprese slovníku Burrows-Wheelerova transformace Move to front Remove gaps Run length encoding LZ77 a LZ Multistream compression Kodér Základy kódování a modelování Kódování Modelování Statické modelování Semiadaptivní modelování Adaptivní modelování Kódování a modelování v XBW Kódování celých čísel Alpha kód Alpha-phase kód Beta kód Beta-phase kód Gamma kód Delta kód Porovnání gamma a delta kódování Huffmanovo kódování Základy Huffmanova kódování Semiadaptivní Huffmanovo kódování

4 5.2.1 Kanonický Huffmanův kód Konstrukce kanonického kódu Výpočet délek kódových slov Kódování modelu Efektivní dekódování Adaptivní Huffmanovo kódování Aritmetické kódování Kumulovaná četnost Celočíselné aritmetické kódování Semiadaptivní aritmetické kódování Kódování Dekódování Kódování modelu Normalizace četností Adaptivní aritmetické kódování Jednoduchá aktualizace kumulovaných četností Fenwickova datová struktura Moffatova datová struktura Škálování četností Metoda remove gaps Odstranění děr Kódování děr Vliv RG na kompresní poměr a rychlost komprese Multistream Compression Konstrukce binárního stromu Konstrukce posloupností čítačů Metody komprese posloupností čítačů Kódování posloupností čítačů Dekomprese Poznámky k implementaci Možná vylepšení Porovnání metod pro kódování posloupností čítačů Výsledky Testovací sady Označení metod Kompresní poměr Rychlost komprese a dekomprese XBW Rychlost komprese a dekomprese metod SSC a SAC Srovnání s dalšími programy

5 10 Závěr 59 Literatura 60 Dodatky 62 Seznam tabulek 62 Seznam algoritmů 64 Seznam obrázků 65 5

6 Název práce: Entropické kodéry Autor: Petr Uzel Katedra: Katedra softwarového inženýrství Vedoucí diplomové práce: Mgr. Jan Lánský, Ph.D. vedoucího: Abstrakt: Cílem této diplomové práce je implementace různých metod entropického kódování a měření jejich kompresního poměru a rychlosti v kontextu programu XBW [Lan07]. Tyto metody zahrnují aritmetické kódování (s použitím Moffatovy [Mof99] a Fenwickovy [Fen96] datové struktury pro aktualizaci kumulovaných četností), Huffmanovo kódování [Huf52] a metodu Multistream Compression [KLUZ08]. Důraz je kladen na použití metod nad velkou abecedou. Pro metodu MSC je dále cílem návrh a experimentální ověření metod pro kódování posloupností čítačů. Klíčová slova: kódování, komprese, aritmetické kódování, multistream komprese Title: Entropic Coders Author: Petr Uzel Department: Department of Software Engineering Supervisor: Mgr. Jan Lánský, Ph.D. Supervisor s address: zizelevak@gmail.com Abstract: Goal of this work is an implementation of various methods of entropy coding and measuring of their compression ratio and speed in context of the XBW project [Lan07]. These methods include arithmetic coding (with using both Moffat s [Mof99] and Fenwick s [Fen96] data structures for actualization of cumulated counts), Huffman coding [Huf52] and Multistream Compression [KLUZ08]. There is an emphasis on using these methods on large alphabets. For the Multistream Compression method, the goal is also to design and experimentally test various methods for encoding of streams of counters. Keywords: coding, compression, arithmetic coding, multistream compression 6

7 Kapitola 1 Úvod Entropické kódování je technika využívaná současnými kompresními algoritmy k efektivnímu zápisu dat do komprimovaných souborů. V současnosti jsou používány dva hlavní typy kódování: Huffmanovo a aritmetické. Řada kompresních metod pracuje pouze nad jednotlivými znaky a využívá tedy kodér pouze nad malou abecedou, např. 255 znaků pro kódování ASCII. V programu XBW je však zařazena komponenta pro parsování vstupních dat, která způsobuje, že kodér musí být schopen efektivně pracovat nad abecedami, které jsou řádově větší. V případě aritmetického kódování existují dvě metody, v této práci označované jako Fenwickova a Moffatova, které umožňují efektivní fungování kodéru nad velkou abecedou díky logaritmické složitosti prováděných operací. Obě tyto metody byly implementovány do programu XBW a tedy bylo možné je porovnat z hlediska dosahované rychlosti kódování a dekódování. Huffmanovo kódování, které je také implementováno v programu XBW, je možné také libovolně zaměňovat s komponentou aritmetického kodéru, což nám umožnilo porovnat tyto dva typy kódování z hlediska dosahovaného kompresního poměru i rychlosti kódování a dekódování. V další části této diplomové práce byla implementována kompresní metoda Multistream Compression. Tato metoda transformuje vstupní posloupnost na vícero výstupních posloupností čítačů, které mohou být dále kódovány různými algoritmy. Implementovali jsme pět metod pro kódování posloupností čítačů, které jsme vzájemně porovnali. Dále jsme se snažili nalézt optimální posloupnost transformací (parser, Burrows-Wheelerova transformace, Move to front) před metodou Multistream Compression, která by umožnila dosažení co nejlepšího kompresního poměru. Tuto kombinaci metod jsme porovnali s ostatními metodami dostupnými v programu XBW, tj. RLE, LZC a LZSS a také s dalšími kompresními programy (bzip2, gzip, rar a szip). 7

8 Kapitola 2 XBW XBW [Lan07] je kompresní program primárně určený pro bezztrátovou kompresi velkých (řádově desítky MB) nevalidních XML souborů v kódování Unicode. Program vznikl za účelem komprese dat pro fulltextový vyhledávač Egothor [Gal] a dále pak jako platforma pro testování efektivity různých kombinací kompresních algoritmů. Architekturu programu znázorňuje obrázek Parser Parser je komponenta zodpovědná za převedení vstupního souboru na pole identifikátorů, které je poté předáno dalším komponentám. Parser může pracovat ve dvou různých režimech: v textovém režimu nebo v XML režimu. Při práci v XML režimu parser dělí vstupní soubor na různé elementy, které tvoří strukturu XML dokumentu, tj. atributy, značky atd., přičemž z těchto elementů dynamicky vytváří slovník. V textovém režimu parser považuje vstupní text pouze za posloupnost slov a nealfanumerických znaků bez předpokladů o nějaké struktuře. Parser dále podporuje různé režimy dělení slov: dělení na znaky, dělení na slabiky a práci s celými slovy. Při dělení na znaky je podporováno mnoho různých kódování včetně vícebajtových kódování jako např. UTF-8. Podporováno je několik algoritmů dělení na RLE BWT MTF RG LZ Kodér Výstup Vstup Parser TDx MSC Obrázek 2.1: Architektura XBW: postup při kompresi 8

9 slabiky [LZ06]. Naparsované elementy jsou předány komponentě slovníku, která elementům přiřazuje celočíselné identifikátory. Výstupem parseru je tedy pole těchto elementů a dále jeden či více slovníků. 2.2 Komprese slovníku Slovníkem je míněna množina dvojic slovo-identifikátor. Slovníkový kompresor přijímá od parseru jednotlivá slova a přiřazuje jim jednoznačné celočíselné identifikátory. Pro reprezentaci slovníku je použita datová struktura trie, což je strom, kde každý uzel má maximálně n potomků, kde n je velikost použité abecedy. Kořen trie reprezentuje prázdné slovo, první písmena každého slova jsou reprezentována syny kořenového symbolu atd. Po vybudování této datové struktury, tj. po naparsování vstupního dokumentu parserem, je úkolem slovníkového kompresoru efektivní zakódování trie do komprimovaného souboru. K tomuto jsou v programu XBW použity metody TD1, TD2 a TD3 [LZ07]. 2.3 Burrows-Wheelerova transformace Burrows-Wheelerova transformace (BWT) [BW94], produkuje ze vstupní posloupnosti symbolů její reverzibilní permutaci takovou, že v případě, že vstupní posloupnost symbolů má několik podposloupností, které se v ní vyskytují vícekrát, bude mít výstupní posloupnost několik míst, kde se vyskytuje stejný symbol několikrát za sebou. Takové uspořádání je výhodné pro některé kompresní algoritmy, jako například RLE. V programu XBW je implementováno několik různých algoritmů pro BWT s různou časovou složitostí. Práce [SLZ08] se zabývá jejich porovnáním v kontextu programu XBW. 2.4 Move to front Transformace Move-to-front (MTF) [BSTW86] je často používaná jako fáze následující po BWT a předcházející RLE fázi. Základní myšlenkou MTF je transformace vstupní posloupnosti symbolů na jinou (reverzibilní) posloupnost, kde hodnoty symbolů jsou nižší než ve vstupní posloupnosti. Implementace MTF v programu XBW používá datovou strukturu splay-tree pro zvýšení efektivity. Zařazení transformace MTF je obvykle výhodné z důvodu výpočetní nenáročnosti a schopnosti značně zlepšit kompresní poměr dále použitých metod. 2.5 Remove gaps Transformace označovaná v této práci jako Remove gaps slouží k úpravě abecedy vstupní posloupnosti do takové podoby, kdy je abeceda spojitá, tzn. každý symbol z množiny 1..N se v posloupnosti vyskytuje alespoň jednou. Transformace je povinná při použití metody 9

10 MSC, ale může být využita i společně s jinými metodami. Účelem RG je zjednodušení implementace metody MSC. 2.6 Run length encoding Run-length encoding (RLE) je poměrně jednoduchá kompresní metoda, která pracuje tak, že místo posloupnosti opakujících se symbolů je do výstupu zakódována hodnota symbolu a počet jeho opakování. V programu XBW jsou implementovány tři různé varianty metody RLE. 2.7 LZ77 a LZ78 Metody LZ77 [ZL77] a LZ78 [ZL78] jsou zástupci skupiny kompresních metody označovaných jako slovníkové metody. V programu XBW jsou implementovány varianty těchto metod označované jako LZC a LZSS. Algoritmus LZ77 prochází vstupní posloupnost a v případě, že narazí na skupinu symbolů, která se v již prošlé části objevila, nahradí tuto skupinu symbolů odkazem na předchozí výskyt. Odkaz je zakódován jako vzdálenost od současné pozice a délka skupiny znaků. Na rozdíl od LZ77, které hledá shodu v již zpracované části vstupní posloupnosti, se LZ78 snaží při hledání shody hledat dále, v ještě nezpracované části vstupní posloupnosti. 2.8 Multistream compression Metoda Multistream Compression [KLUZ08], označovaná jako MSC, je poměrně nová metoda pro bezztrátovou kompresi dat. Základní myšlenkou metody je transformace vstupní posloupnosti do několika různých výstupních posloupností symbolů, které mají vlastnosti vhodné pro kompresi, a mohou být dále komprimovány jinými kompresními metodami. Komprese probíhá ve třech krocích: v prvním kroku je vytvořen binární strom na základě statistické analýzy vstupních dat algoritmem podobným algoritmu konstrukce Huffmanova stromu. V dalším kroku je pro každý uzel binárního stromu vytvořena výstupní posloupnost. V posledním kroku je provedena komprese jednotlivých posloupností dat a jejich zapsání do výstupního souboru. Metodě MSC se podrobně věnuje kapitola Kodér Kodér, o němž převážně pojednává tato práce, je komponenta XBW zodpovědná za bitový výstup do komprimovaného souboru. V XBW jsou implementována dvě kompresní schémata: aritmetické kódování a Huffmanovo kódování, oba v semiadaptivní a adaptivní variantě (viz str. 12). 10

11 Huffmanovo kódování [Huf52] je typem entropického kódování, kde jsou jednotlivým symbolům tvořícím abecedu vstupní zprávy přiřazena kódová slova různých délek tak, aby byla zachována dekódovatelnost a aby délka kódových slov odpovídala četnosti výskytu daného symbolu ve vstupní zprávě. Aritmetické kódování [WNC87] je dalším typem entropického kódování, které však na rozdíl od Huffmanova kódování přiřazuje jednoznačný kód vstupní zprávě jako celku. Z důvodu testování výkonnosti kodéru s omezeným vlivem dalších kompresních metod jsou v XBW implementovány dvě metody založené na kodéru, které provádějí poslední fázi kódování. Jejich vstupem je tedy posloupnost symbolů generovaná první fází komprese (Parser, BWT) a tyto metody provedou komprimovaný zápis do výstupního souboru. Implementovány jsou dvě metody: metoda označovaná v této práci jako SSC (Simple static coding) používá semiadaptivní verzi kodéru. Metoda SAC (Simple adaptive coding) provádí kompresi s použitím adaptivní verze kodéru. 11

12 Kapitola 3 Základy kódování a modelování 3.1 Kódování V této práci se zabýváme entropickým kódováním. Entropické kódování je kompresní schéma, které přiřazuje jednotlivým symbolům tvořícím vstupní zprávu kódová slova tak, že délka těchto kódových slov odpovídá pravděpodobnosti výskytu symbolu ve vstupní zprávě. Jinými slovy, entropické kodéry pracují tak, že nahrazují symboly stejné délky ve vstupní zprávě kódovými slovy, jejichž délka je různá a nejčastěji se vyskytujícím symbolům jsou přiřazena nejkratší kódová slova. Podle Shannona [SPS48] je optimální délka kódového slova rovna log 2 p, kde p je pravděpodobnost výskytu daného symbolu. 3.2 Modelování Proces komprese se obvykle dělí na dvě oddělené komponenty: modelování a (de)kódování. Model představuje reprezentaci vstupní zprávy v tom smyslu, že se snaží předpovědět pravděpodobnost výskytu vstupních symbolů. Kodér produkuje komprimovaný výstup. Pro zajištění dekódovatelnosti je nutné, aby kodér i dekodér používali stejný model. V závislosti na tom, jak kodér a dekodér nakládají s modelem, lze rozdělit modelování na statické, semiadaptivní a adaptivní Statické modelování Při statickém modelování je model připraven před vlastní kompresí a je tedy z principu nezávislý na charakteru vstupních dat a v průběhu komprese se nemění Semiadaptivní modelování Semiadaptivní modelování je na rozdíl od předchozího typu závislé na vstupních datech. Vyžaduje dva průchody přes vstupní data. Při prvním průchodu dochází k analýze dat a vytvoření modelu. Vlastní kódování probíhá při druhém průchodu, kdy jsou data kódována 12

13 pomocí vytvořeného modelu. Nevýhodou semiadaptivního modelování je skutečnost, že dekodér není schopen rekonstruovat použitý model a proto je nutné, aby byl model součástí komprimované zprávy, což však snižuje kompresní poměr Adaptivní modelování Adaptivní modelování znamená, že model je vytvářen přímo v průběhu komprese na základě toho, jaká data jsou kódována. Vyžaduje tedy pouze jeden průchod vstupními daty a není nutné přenášet model ve vstupní zprávě, neboť dekodér simuluje činnost kodéru a vytváří identický model Kódování a modelování v XBW Kodér pracuje s modely nultého řádu 1, které označuje jako kontexty. Kontext může být chápán jako množina symbolů, z nichž každý má přiřazenu pravděpodobnost výskytu. Kodér poskytuje vyšší vrstvám funkce pro semiadaptivní a adaptivní modelování. Rozšíření o podporu statického modelování by bylo triviální v případě takové potřeby. Modely vyšších řádů, jaké používá např. metoda PPM [CIW84, Mof90], mohou být vytvořeny s využitím vícero modelů nultého řádu. Je tedy možné (a očekávané), že v průběhu komprese je použito zároveň několik kontextů, které mohou být i různých typů. 1 Modely nultého řádu jsou takové modely, kde model při uvažování pravděpodobnosti výskytu symbolu nebere v potaz symboly, které danému symbolu předcházely. 13

14 Kapitola 4 Kódování celých čísel Program XBW potřebuje z mnoha důvodů kódovat celá čísla a tato čísla efektivně ukládat do komprimovaného souboru. XBW pro tento účel používá Eliášovy kódy [Eli75]. Konkrétně, použitými typy kódů jsou alpha, alpha-phase, beta, beta-phase, gamma a delta. Literatura popisuje mnoho dalších metod pro kódování celých čísel, např. Fibonacciho kód, Golombův kód [Gol66], Rodeh kód [RPE81]. V každé konkrétní situaci je důležité vybrat správnou kódovací metodu pro dosažení co největší efektivity a co nejlepšího kompresního poměru. Nejdůležitějším kritériem pro výběr správného typu kódu je odhad velikosti kódovaného čísla. Dále, některé typy kódů mohou být použity bez znalosti maximální velikosti kódovaného čísla, zatímco jiné typy kódů tuto znalost vyžadují. Vlastnosti jednotlivých kódů použitých v XBW jsou popsány dále. 4.1 Alpha kód Pro x N,x 1 α(x) je definováno jako α(1) = 1 α(x + 1) = 0 α(x) Alpha kód je jeden z nejjednodušších kódů pro kódování celých čísel. Pro celé číslo x > 0 je kód tvořen x 1 nulami a ukončen je jednou jedničkou. Tento typ kódování je poměrně efektivní pro kódování malých hodnot, avšak značně neefektivní pro hodnoty větší. Přesněji, tento typ kódování má smysl použít, pokud p(x) 2 p(x + 1), kde p(x) je pravděpodobnost výskytu hodnoty x. Kódování i dekódování je velmi jednoduché a není předem nutné znát maximální možnou hodnotu. 4.2 Alpha-phase kód Pro x N,x 1,l N,l x α p (x,l) je definováno jako 14

15 α p (x,l) = α(x) pro x < l α p (x,l) = (l 1) 0 pro x = l Alpha-phase kód je možné použít za podobných podmínek jako alpha kód, pokud je však navíc předem známa maximální možná velikost kódovaného symbolu x, tzn. pokud lze z jistotou říci, že kódovaná hodnota nebude větší než l. Jediný rozdíl oproti alpha kódu spočívá v tom, že pokud x = l, tak je možné ušetřit jeden bit tím, že koncová jednička není zapsána do výstupního proudu. Podobně jako v případě předchozího kódu, algoritmus kódování i dekódování je velmi jednoduchý. 4.3 Beta kód Pro x N β n (x) je definováno jako β n (1) = 1 β n (2x) = β n (x) 0 β n (2x + 1) = β n (x) 1 n-bitový beta kód získáme tak, že zleva doplníme β n () nulami tak, aby celková délka kódu byla n bitů. Tento kód je vhodné použít v případě, že maximální možná velikost kódovaného symbolu je předem známa a navíc je pravděpodobnost výskytu shodná pro všechny potenciální hodnoty. Pokud maximální možná hodnota není přesně nějakou mocninou dvojky, je vhodné zvážit použití beta-phase kódu. Hlavní nevýhodou je skutečnost, že je vždy zapotřebí přesně n bitů pro zakódování čísla. 4.4 Beta-phase kód Pro x N,l N,x < l β p (x,l) je definováno jako β p (x,l) = β 2 log 2 x 1 (x) když x < 2 log 2 x l + 1 β p (x,l) = β 2 log 2 x (x + 2 log 2 x l + 1) jinak Výhodou oproti beta kódu je to, že pro menší hodnoty x je zapotřebí méně bitů a proto by tento kód měl být preferován za předpokladu, že je předem známa maximální možná velikost kódovaného čísla l a tato velikost není přesnou mocninou dvojky. Tabulka 4.1 uvádí příklady beta-phase kódů s l =

16 4.5 Gamma kód Tabulka 4.1: Beta-phase kód-příklad x β p (x, 15) Nechť β (x) = β(x) bez počátečního bitu, β (x) = log 2 (x) a γ (x) = α( β(x) ) β (x). Pak pro x N,x 1 γ(x) je definováno jako permutace γ (x) taková, že každý bit z kódu alpha je následován bitem z kódu beta. Toto kódování se nejčastěji využívá v případě, že maximální možná hodnota kódovaného symbolu není předem známa a navíc nelze použít alpha kód z důvodu příliš vysoké pravděpodobnosti výskytu vysokých hodnot symbolu. Pro x 1 platí γ(x) = log 2 (x) Procedury kódování a dekódování zobrazují algoritmy 1 a 2. Příklady gamma kódu pro několik celých čísel uvádí tabulka Delta kód Pro x N,x 1, δ(x) je definováno jako δ(x) = γ( β(x) ) β (x), kde β (x) = β(x) bez počátečního bitu. Podobně jako v případe gamma kódu, delta kód je vhodné použít, pokud není předem známa maximální možná hodnota kódovaného symbolu. Pro délku kódu platí vztah δ(x) = ( log 2 ( log 2 (x) + 1) + 1) + log 2 (x) Algoritmy pro kódování a dekódování jsou uvedeny na obrázcích 3 a 4. Příklady delta kódu pro několik celých čísel uvádí tabulka

17 Algoritmus 1 Gamma kódování len log 2 (x) i 2 (len 1) while i > 0 do output 0 if x&i then output 1 else output 0 end if i i/2 end while output 1 Algoritmus 2 Gamma dekódování result 1 while readbit 1 do result result 2 if readbit = 1 then result result + 1 end if end while return result Algoritmus 3 Delta kódování len log 2 (x) zakóduj x gamma kódováním i 2 (len 1) while i > 0 do if x&i then output 1 else output 0 end if i i/2 end while output 0 17

18 Tabulka 4.2: Příklady gamma a delta kódu x γ(x) δ(x) Porovnání gamma a delta kódování Ze vztahů pro délky gamma a delta kódů vyplývá, že gamma kód je kratší pro hodnoty x [1, 32]. Pro větší hodnoty je výhodnější použít delta kódování. Obrázek 4.1 graficky znázorňuje rozdíl mezi délkami kódů pro různé hodnoty. Algoritmus 4 Delta dekódování result 1 len číslo dekódované pomocí gamma i 1 while i < len do result = result 2 if readbit = 1 then result = result + 1 end if i i + 1 end while return result 18

19 12 gamma delta 14 gamma delta (a) 1-32 (b) gamma delta 35 gamma delta (c) (d) Obrázek 4.1: Porovnání délky gamma a delta kódu 19

20 Kapitola 5 Huffmanovo kódování Termín Huffmanovo kódování [Huf52] se používá pro taková kódovací schémata, kdy je použit kód s různou délkou kódových slov a délka kódových slov je odvozena na základě pravděpodobnosti výskytu jednotlivých symbolů ve vstupní zprávě. Pro množinu vstupních symbolů, kde všechny symboly mají stejnou pravděpodobnost výskytu a navíc počet těchto symbolů je nějakou mocninou dvojky, je Huffmanův kód ekvivalentní jednoduchému binárnímu blokovému kódu, jakým je např. ASCII. Huffmanovo kódování je natolik rozšířená metoda, že bývá užívána jako synonymum pro všechny prefixové kódy i v případě, že daný prefixový kód nebyl vytvořen pomocí Huffmanova algoritmu. 5.1 Základy Huffmanova kódování Jak bylo naznačeno výše, Huffmanovo kódování je prefixový kód, což znamená, že má prefixovou vlastnost. Definice 5.1 (Prefixová vlastnost) Žádné kódové slovo není prefixem jiného kódového slova. Kód s kódovými slovy 0, 10, 11 má prefixovou vlastnost, zatímco kód obsahující kódová slova 0, 1, 10, 11 tuto vlastnost nemá, neboť 1 je prefixem kódových slov 10 a 11. Prefixová vlastnost zaručuje, že dekodér bude schopen jednoznačně dekódovat posloupnost kódových slov, a to postupným odstraňováním prefixů, které tvoří platná kódová slova. Myšlenka spojená s Huffmanovým kódováním spočívá v použití krátkých kódových slov pro časté symboly a naopak dlouhých kódových slov pro symboly jež se tak často nevyskytují při zachování prefixové vlastnosti. Cílem je taková kódová slova nalézt. Tuto úlohu lze formalizovat následovně. Nechť A = {a 1,a 2,...,a n } je množina symbolů, W = {w 1,w 2,...,w n } jsou nezáporné váhy přiřazené symbolům z A. Úkolem je nalézt kód C(A,V ) = {c 1,c 2,...,c n }, který tvoří množinu kódových slov pro symboly z A tak, že n L(C) = w i length(c i ) < L(T), i=1 20

21 Tabulka 5.1: Příklad Huffmanova kódu Symbol Četnost Kód 1 Kód 2 Kanonický kód pro jakýkoliv jiný kód T(A,W). Pro konstrukci Huffmanova kódu lze použít původní Huffmanův algoritmus [Huf52], což jsme provedli při implementaci adaptivní verze, avšak pro semiadaptivní verzi jsme použili odlišný přístup (viz sekce 5.2.2). 5.2 Semiadaptivní Huffmanovo kódování Semiadaptivní Huffmanovo kódování označuje takové kódování, kde jsou všechny symboly a jejich váhy (četnosti, frekvence) známy před zahájením kódování. Jak bylo popsáno na straně 12, probíhá kódování ve dvou fázích. V první fázi jsou analyzována vstupní data a následně jsou informace o symbolech a jejich četnostech (model) předány kodéru. Poté kodér zkonstruuje kódová slova pro všechny symboly a zakóduje model do výstupního proudu. Ve druhé fázi probíhá vlastní kódování symbolů a už nedochází ke změnám modelu. Dekodér pracuje obdobně jako kodér. V první, inicializační, fázi dekodér načte model z komprimovaného proudu a zrekonstruuje kódová slova, která byla použita kodérem. Vlastní dekódování symbolů probíhá ve druhé fázi. Kodér v XBW je navržen tak, že první fáze probíhá jako celek (analýzu vstupních dat neprovádí kodér, ale vyšší vrstvy), ale ve druhé fázi, tj. po inicializaci kontextu, lze kódovat symboly po jednom a případně střídat různé kontexty Kanonický Huffmanův kód Pro každý vstup obvykle existuje více různých Huffmanových kódů, které se mohou lišit např. v délce kódových slov. Dokonce i když je délka kódových slov zafixována, tak může existovat více Huffmanových kódů, jak ukazuje tabulka 5.1. Z různých důvodů se vyplatí vybrat z těchto kódů jeden konkrétní a ten označit jako kanonický Huffmanův kód [Nek99]. Definice 5.2 (Kanonický Huffmanův kód) Jako kanonický Huffmanův kód označíme takový Huffmanův kód, který splňuje následující podmínky: 21

22 1. pokud doplníme všechna kódová slova zprava nulami tak, aby měla všechna stejnou délku, pak kratší kódy mají číselně větší hodnotu, než kódy delší 2. kódy stejné délky jsou vzájemně uspořádány podle abecedy, Tato definice zaručuje následující vlastnosti kódu : maximálně log 2 (n) nejpravějších bitů je nenulových lze efektivně dekódovat, viz sekci kód lze kompletně rekonstruovat pouze ze znalosti délek jednotlivých kódových slov Konstrukce kanonického kódu Algoritmus 5 Konstrukce kanonického Huffmanova kódu pro každý symbol spočítej délku kódového slova l i for l 1 to maxlength do numl[l] 0 end for for i 1 to n do numl[l i ] numl[l i ] + 1 end for f irstcode[maxlength] 0 for l maxlength 1 downto 1 do firstcode[l] (firstcode[l + 1] + numl[l + 1])/2 end for for i = 1 to n do codeword[i] firstcode[l i ] firstcode[l i ] firstcode[l i ] + 1 end for Proceduru pro konstrukci kanonického Huffmanova kódu zobrazuje algoritmus 5. Nejprve, pro každý symbol abecedy i je vypočtena délka l i odpovídajícího kódového slova. O způsobu výpočtu kódových délek podrobněji pojednává sekce V dalším kroku algoritmu jsou kódová slova rozdělena do skupin podle délek a je zjištěno, kolik má která skupina členů. Dále algoritmus spočítá, jaké kódové slovo bude přiřazeno prvnímu symbolu z každé skupiny. První kód ve skupině s největší délkou obsahuje samé nuly a každý další ve stejné skupině je o jedna větší. Pro ukázkovou množinu symbolů uvedenou v tabulce 5.2 tento výpočet vypadá následovně: kódová slova délky 4 začínají

23 Tabulka 5.2: Kanonický Huffmanův kód Symbol Délka KS KS dekadicky KS l bit prefix i l i codeword[i] numl[l] f irstcode[l] Tabulka 5.3: Dekódovací tabulka codelength symbols kódová slova délky 3 začínají ( ) 1 = 010. Ve skupině symbolů s délkou kódu 4 jsou 4 prvky, tedy další prvek z této skupiny by byl Protože však hledáme kódové slovo délky 3, tak odstraníme koncovou 0. kódová slova délky 2 začínají ( ) 1 = 10 kódová slova délky 1 začínají ( ) 1 = 1 V posledním kroku algoritmu jsou symbolům přiřazena vlastní kódová slova Výpočet délek kódových slov Algoritmus konstrukce kanonického Huffmanova kódu vyžaduje znalost délek kódových slov. Nejjednodušší metoda, kterou lze k tomuto účelu využít, spočívá v konstrukci Huffmanova stromu [Huf52]. Existuje však i další, efektivnější metoda pro výpočet délek kódových slov na místě [MK95]. V XBW používáme právě tuto metodu Kódování modelu Jedna z výhod plynoucích z použití kanonického Huffmanova kódu spočívá v tom, že znalost délek kódových slov je postačující k plné rekonstrukci modelu, tj. kódových slov. 23

24 Algoritmus 6 Kódování modelu delta kódováním zapiš počet symbolů v modelu l 2 for all symbol s do l s délka kódového slova symbolu s if l s = l then output 1 else if l s < l then output 0 zakóduj l l s alfa kódováním else output 1 zakóduj l s l alfa kódováním end if end if l = l s end for Toho lze využít pro efektivní zakódování modelu pro účely jeho rekonstrukce dekodérem. Kodér tedy zakóduje pouze počet symbolů v modelu a délky kódových slov. V našem algoritmu je počet symbolů v modelu kódován delta kódováním, neboť lze očekávat, že pro obvyklé vstupy počet symbolů v modelu přesáhne 32 (viz sekce 4.7). Poté jsou postupně procházeny všechny symboly a pro každý symbol je délka kódového slova zakódována jako rozdíl oproti délce předchozího kódového slova. Pokud je délka stejná jako ta předchozí, zapíše se 0. Pokud se délky liší, zapíše se 1 a poté další bit, který označuje, zda je délka větší či menší než délka předchozí. Rozdíl mezi délkami je kódován s použitím alpha kódování. Algoritmus 6 detailně popisuje proceduru kódování modelu. Je zřejmé, že efektivita námi použité metody je značně závislá na charakteru vstupu, čímž je v tomto případě posloupnost kódových délek, což znamená 1, že metoda je efektivní pouze v případě, že posloupnost četností se co nejvíce blíží rostoucí nebo klesající posloupnosti. Přesně takový je však v programu XBW obvyklý charakter vstupu pro kodér, což činí výběr metody oprávněným. V případě potřeby lze triviálně implementovat i další metody pro kódování modelu. V minulých verzích programu byla implementována ještě další metoda pro kódování modelu, kdy se všechny kódové délky kódovaly s použitím gamma kódování. Tato metoda nečinila žádné předpoklady o charakteru vstupu a pravděpodobně právě proto dosahovala v rámci programu XBW vždy horších výsledků než výše popsaná metoda a byla tedy vyřazena. 1 Vzhledem ke vztahu mezi četností symbolu a délkou kódového slova. 24

25 5.2.5 Efektivní dekódování První verze programu XBW používala pro dekódování Huffmanova kódu jednoduchý algoritmus, který byl založen na konstrukci Huffmanova stromu z kódových slov a dekódování s použitím tohoto stromu. Pro každý dekódovaný symbol tedy bylo třeba projít celým stromem od kořene k listům. Tento algoritmus je však neefektivní z následujících důvodů: zbytečná konstrukce Huffmanova stromu stejně jako u většiny operací nad stromy, jejichž uzly jsou alokovány dynamicky, zahrnuje procházení Huffmanova stromu mnoho náhodných skoků v paměti, čímž dochází k neefektivnímu využití vyrovnávacích pamětí Z výše uvedených důvodů jsme se rozhodli využít možnosti kanonického Huffmanova kódu a implementovat algoritmus efektivního dekódování [Nek99], který nevyžaduje konstrukci Huffmanova stromu. 5.3 Adaptivní Huffmanovo kódování Jednou z nevýhod semiadaptivního Huffmanova kódování je nutnost přenášet model společně s komprimovanou zprávou. Tuto, a další nevýhody lze odstranit použitím adaptivního kódování. Nejznámějšími algoritmy pro adaptivní Huffmanovo kódování jsou FGK [Knu85] a algoritmus označovaný jako V [Vit85], nebo také Vitter. Při použití adaptivní verze Huffmanova kódování stačí jeden průchod vstupními daty, neboť model je vytvářen přímo v průběhu kódování na základě dat, která jsou komprimována. Při dekódování dekodér konstruuje a používá identický model. V programu XBW jsme použili algoritmus Vitter pro adaptivní Huffmanovo kódování. Algoritmus používá binární strom pro reprezentaci kódu. Základem algoritmu je udržování invariantu, který bývá označován jako sourozenecká vlastnost: Definice 5.3 (Sourozenecká vlastnost) Binární strom má sourozeneckou vlastnost právě když 1. každý uzel kromě kořene má sourozence 2. uzly lze uspořádat v nerostoucím pořadí tak, že sourozenci spolu v tomto uspořádání sousedí Platí, že binární prefixový kód je Huffmanovým kódem, právě když binární strom pro tento prefixový kód má sourozeneckou vlastnost [Knu85]. Váha každého uzlu stromu odpovídá počtu výskytů daného symbolu v dosud zakódované části zprávy, tj. jeho četnosti. Na počátku kódování má obsahuje strom pouze jeden uzel, tzv. escape symbol. Jedná se o speciální symbol, který slouží pro reprezentaci a přidávání symbolů, které se v průběhu kódování ještě nevyskytly a tedy nejsou součástí 25

26 modelu. Při zakódování každého symbolu kodér zvyšuje váhu symbolu a v případě potřeby (tj. když přestane platit sourozenecká vlastnost) přestaví strom. Dekodér při dekódování provádí stejné operace. Když kodér narazí na dosud nepoužitý symbol, dojde k rozštěpení escape symbolu na dvojici jiných uzlů - jeden z nově vytvořených uzlů bude reprezentovat nový symbol a druhý bude reprezentovat nový escape symbol. Může nastat potřeba přebudovat strom. Po rozštěpení escape symbolu je zapsán kód odpovídající novému escape symbolu. Navíc je třeba do výstupního proudu nějakým způsobem zakódovat hodnotu nově přidaného symbolu; k tomu lze využít např. jeden z Eliášových kódů (viz str. 14). Aktualizaci stromu po zvýšení váhy symbolu lze provést jedním průchodem směrem od listu reprezentujícího daný symbol směrem ke kořeni. Po cestě jsou jsou zvyšovány váhy všech uzlů, přičemž dochází k záměnám uzlů tak, aby byla zachována sourozenecká vlastnost. 26

27 Kapitola 6 Aritmetické kódování Na rozdíl od Huffmanova kódování, při aritmetickém kódování nejsou kódová slova přiřazena jednotlivým symbolům, ale hledá se takový kód, který reprezentuje celou vstupní zprávu. Výstupem aritmetického kódování je číslo z intervalu [0, 1). Na počátku kódování je vstupní zpráva reprezentována celým tímto rozsahem. V průběhu kódování dochází ke zjemňování intervalu podle toho, jaké symboly jsou kódovány, jak zobrazuje algoritmus 7. Na konci procesu kódování je vybráno takové číslo z výsledného intervalu, které má co možná nejkratší binární reprezentaci. Toto číslo reprezentuje vstupní zprávu. Je zřejmé, že čím je vstupní zpráva delší, tím menší je výsledný interval a tedy je potřeba více bitů pro jeho reprezentaci. Algoritmus 7 Aritmetické kódování S = {s 1,s 2,...,s n } je abeceda vstupní zprávy c 1,c 2,...,c n jsou četnosti symbolů z S I [0, 1) while není konec vstupní zprávy do s další symbol vstupní zprávy;!k,s = s k rozděl I na podintervaly I 1,I 2,...,I n tak, že I j I I I k end while vyber číslo x I s nejkratší binární reprezentací zapiš x binárně do výstupního proudu = c j c Postup dekódování zobrazuje algoritmus 8. Na počátku je načteno číslo c, které reprezentuje zakódovanou zprávu. Dále je počáteční interval I = [0, 1) rozdělen na podintervaly, jejichž velikosti odpovídají četnostem symbolů z abecedy. Na základě toho, do kterého podintervalu I k patří c, je dekódován symbol a k a interval I je odpovídajícím způsobem upraven. Dekódování takto pokračuje až do posledního symbolu. 27

28 Algoritmus 8 Aritmetické dekódování S = {s 1,s 2,...,s n } je abeceda vstupní zprávy c 1,c 2,...,c n jsou četnosti symbolů z S kód c kódovaná zpráva I [0, 1) while všechny symboly nebyly dekódovány do rozděl I na podintervaly I 1,I 2,...,I n tak, že I j I binárním vyhledáváním najdi takové k, že c I k output symbol k I = I k c = end while c lower bound of I I 6.1 Kumulovaná četnost = c j c Při operacích s četnostmi symbolů používáme tzv. kumulované četnosti. Definice 6.1 (Kumulovaná četnost) Nechť c s je četnost symbolu s ve vstupní zprávě. Potom kumulovaná četnost symbolu s je s h s = c s,h 0 = 0 i=1 Dále označme n počet symbolů v kontextu, l s = s 1 i=1 c i a t = n i=1 c i, pak platí vztah s h s = c i = l s + c s i=1 Kódovací operace, tj. zakódování jednoho symbolu, může být nyní popsána trojicí (l s,h s,t). Jádro aritmetického kodéru, zobrazené v algoritmu 9, opakovaně provádí tuto kódovací operaci. 6.2 Celočíselné aritmetické kódování V projektu XBW používáme celočíselnou verzi aritmetického kódování, kde je interval I reprezentován dvěma 32-bitovými hodnotami, I = [low,high). Všimněme si, že interval je zúžen při každém volání kódovací procedury, avšak není přitom produkován žádný výstup. Bitový výstup totiž produkuje procedura expand_interval, která je zobrazena algoritmem 10. Bez volání této procedury by se velikost intervalu brzy zmenšila natolik, že by ji nadále nebylo možné reprezentovat. Proto se provádí roztažení intervalu vždy, když jeho velikost klesne pod polovinu počáteční velikosti. V celočíselném aritmetickém kódování lze tuto situaci jednoduše rozpoznat; nastane vždy, když je splněna jedna z následujících podmínek: 28

29 Algoritmus 9 Kódovací operace kódujeme symbol s I [low,high) range = high low if h s < sum then high low + range hs t 1 end if low low + range ls t expand_interval(i) 1. první bit low = první bit high 2. první bit low první bit high, druhý bit low = 1 a druhý bit high = 0 První situaci lze vyřešit zapsáním prvního (shodného) bitu do výstupního proudu a bitovým posunem obou hodnot low a high o jeden bit doleva. Tato operace je korektní, protože při žádném dalším zužování intervalu by nedošlo ke změně prvního bitu. Druhá situace vyžaduje poněkud komplikovanější přístup. Je třeba provést bitový posun obou hranic intervalů od druhého bitu o jeden bit doleva, tzn. druhý bit je zahozen. Zároveň je zvýšen čítač takto zahozených bitů. Tyto zahozené bity budou zapsány do výstupního proudu jakmile první bity low a high budou opět shodné. Při jejich zapisování se určí jejich hodnota jako negace prvního bitu z low. Stojí za povšimnutí, že expand_interval je jediná procedura v aritmetickém kodéru, která produkuje nějaký bitový výstup. Při dekódování potřebuje dekodér udržovat interval I synchronizovaný s tím, jak byl použit kodérem při kódování. Proto dekodér používá stejné proměnné pro jeho reprezentaci, tj. low a high. Navíc je v dekodéru zapotřebí ještě třetí proměnná code, která reprezentuje posledních 32 bitů načtených z komprimovaného proudu. Při dekódování platí následující invariant: low code high. Dekodér samozřejmě provádí podobné operace jako kodér. Když expanze intervalu vede k bitovému posunu mezí, je proveden také bitový posun code, načte se jeden bit z komprimovaného proudu a tento bit je připojen k code. Expanze intervalu tak, jak ji provádí dekodér, je zobrazena v algoritmu 11. Dekodér musí být schopen najít takový podinterval J [low,high), že code J. Pro tento účel lze využít binární vyhledávání. K zadané kumulované četnosti a celkovému součtu četností všech symbolů v kontextu hledáme takový symbol s, pro který h s 1 index < h s, kde (code low + 1) index = (n 1) (high low) Aritmetické dekódování je obvykle implementováno jako jedna funkce, která provádí všechny výše zmíněné kroky, tj. určení dekódovaného symbolu, zúžení a opětovná expanze intervalu. Avšak v XBW jsme tyto činnosti rozdělili do dvou kroků: v prvním je binárním vyhledáváním určen dekódovaný symbol a ve druhém procedura arithmetic_decode 29

30 upraví interval. Tato procedura je v podstatě shodná jako její protějšek arithmetic_encode, pouze s tím rozdílem, že volá speciální variantu funkce pro expanzi intervalu (viz algoritmus 11). Algoritmus 10 Expanze intervalu (kodér) I = [low,high) loop if f irst_bit(low) = f irst_bit(high) then output first_bit(low) while underf low_bits > 0 do output first_bit(low) end while low low 1 high high 1 else if second_bit(low) = 1 a second_bit(high) = 0 then underf low_bits underf low_bits + 1 zahoď druhý bit low a high vše od druhého bitu low a high dále posuň o jeden bit doleva last_bit(high) 1 else return end if end loop 6.3 Semiadaptivní aritmetické kódování Semiadaptivní aritmetický kodér z principu své činnosti vyžaduje, aby byl inicializován před prvním použitím. Inicializační procedura přebírá pole reprezentující symboly a jejich četnosti. Na základě těchto četností kodér vypočítá kumulované četnosti jednoduchým průchodem polem četností. Kumulované četnosti jsou dále využívány v proceduře arithmetic_encode. Dále je nutné předat dekodéru počet symbolů v kontextu a jejich četnosti, tj. model. Kódování modelu je dále popsáno v sekci Kódování Kódování symbolů je poměrně jednoduché. Kódovací procedura (viz algoritmus 9) potřebuje jako vstup pouze kumulovanou četnost kódovaného symbolu a symbolu, jenž mu předchází. Obojí lze najít v tabulce kumulovaných četností, která byla vytvořena v průběhu inicializace kodéru. 30

31 Algoritmus 11 Expanze intervalu (dekodér) I = [low,high) loop if f irst_bit(low) = f irst_bit(high) then low low 1 high high 1 code code 1 last_bit(high) 1 last_bit(code) bit načtený s komprimovaného proudu else if second_bit(low) = 1 a second_bit(high) = 0 then zahoď druhý bit low, high a code vše od druhého bitu low a high dále posuň o jeden bit doleva last_bit(high) 1 last_bit(code) bit načtený s komprimovaného proudu else return end if end loop Dekódování Inicializace semiadaptivního aritmetického dekodéru spočívá v načtení modelu, tj. množiny symbolů a jejich četností. Dále jsou vypočteny kumulované četnosti symbolů stejně jako při inicializaci kodéru. Dekodér má tedy k dispozici stejný model a dekódování probíhá tak, jak bylo popsáno v části Kódování modelu Pro kódování modelu jsme použili dvě různé metody, ze kterých je vždy v průběhu komprese vybrána ta, která bude poskytovat lepší výsledky. Při procházení pole četností a výpočtu kumulovaných četností v inicializační proceduře je zároveň vyhodnoceno, kolik bitů pro model by vyžadovala každá z metod. Následně je vybrána ta, která vyžaduje menší množství bitů. Dekodéru je předána informace o zvolené metodě pomocí jednoho bitu. První metoda spočívá v jednoduchém zakódování četností všech symbolů delta kódováním. Druhá metoda je podobná kódování modelu u semiadaptivního Huffmanova kódování (viz sekce 5.2.4) pouze s tím rozdílem, že používáme delta kód pro zakódování rozdílu mezi četnostmi následujících symbolů. 31

32 6.3.4 Normalizace četností Kodér i dekodér používají 32-bitovou proměnnou pro uložení součtu četností všech symbolů v kontextu. Je zřejmé, že za jistých speciálních okolností by mohlo dojít k přetečení této proměnné. Tento problém jsme v programu XBW vyřešili zavedením procedury jež nazýváme normalizace četností, která zajistí, že součet četností nepřekročí limit daný 32-bitovou proměnnou, tj Normalizační procedura pracuje v cyklu. V každém průchodu spočte součet četností 1 a zkontroluje, zda tento součet nepřekročil limit. Pokud se tak stalo, jsou všechny četnosti aktualizovány stejně jako při škálování četností (viz část 6.4.4). Cyklus pokračuje, dokud součet četností není menší než limit. 6.4 Adaptivní aritmetické kódování Adaptivní aritmetické kódování umožňuje přidávání nových symbolů do kontextu i po jeho inicializaci, zvyšování četností symbolů v kontextu a nevyžaduje kódování modelu. Přidávání nových symbolů je umožněno díky speciálnímu symbolu, tzv. escape symbolu. Z pohledu kodéru není escape symbol ničím zvláštní - jedná se pouze o další symbol, který má přiřazenou nějakou váhu. Při kódování nového symbolu (tj. takového, který se doposud v daném kontextu nevyskytl) dochází k tomu, že nový symbol má nulovou četnost. Situace se řeší podobně jako v případě adaptivního Huffmanova kódování, a to tak, že je zakódován escape symbol a nový symbol je přidán do kontextu s nenulovou četností. Podobně dekodér, když dekóduje escape symbol, tak je to pro něj znamení, že má vložit do kontextu nový symbol. Algoritmy 12 a 13 zobrazují kódovací a dekódovací procedury podrobněji. Algoritmus 12 Adaptivní aritmetické kódování kódujeme symbol s if symbol s se již v kontextu vyskytl then arithmetic_encode(l s,h s,t) c s c s + 1 aktualizuj kumulované četnosti symbolů v kontextu else arithmetic_encode(escape) vlož do kontextu nový symbol q,c q = 1 aktualizuj kumulované četnosti symbolů v kontextu end if Důležitými kroky při adaptivním aritmetickém kódování a dekódování je aktualizace kumulovaných četností poté, co je četnost nějakého ze symbolů v kontextu změněna, tedy 1 Pro uložení součtu používáme 64-bitovou proměnnou. 32

33 Algoritmus 13 Adaptivní aritmetické dekódování dekóduj target s = get_symbol(target) if s = escape then arithmetic_decode(l escape,h escape,t) vlož do kontextu nový symbol q,c q = 1 else arithmetic_decode(l s,h s,t) c s c s + 1 aktualizuj kumulované četnosti symbolů v kontextu end if typicky po každém zakódovaném symbolu. Z definice kumulované četnosti (viz str. 28) je zřejmé, že množina symbolů, jejichž kumulovaná četnost musí být aktualizována, závisí na uspořádání symbolů v kontextu. V naší implementaci je uspořádání takové, že prvním symbolem je vždy escape symbol, následují symboly vložené při inicializaci kodéru a nakonec jsou přidávány nové symboly. Toto uspořádání označme < ac. V programu XBW používáme pro aktualizaci kumulovaných četností tři různé metody (které používají různé datové struktury), které jsou popsány dále v této kapitole. Všechny metody musí poskytovat následující operace: get_cumul(s) vrací h s get_symbol(target) pro target [0,t) vrací takové s, že l s target h s increment_count(s) zvýší četnost symbolu i o 1 a aktualizuje kumulované četnosti všech symbolů v kontextu Jednoduchá aktualizace kumulovaných četností Jednoduchá a na první pohled zřejmá metoda aktualizace kumulovaných četností, která byla použita také v práci [WNC87], spočívá v přímém udržování pole kumulovaných četností pro každý symbol. Aktualizace spočívá v průchodu polem od pozice symbolu s, jehož četnost je změněna a aktualizaci kumulovaných četností pro všechny symboly q,s < ac q. Předpokládáme-li pro všechny symboly stejnou pravděpodobnost toho, že jim bude v průběhu kódování zvýšena četnost, pak očekávaná časová složitost kódování každého symbolu je O(n) Fenwickova datová struktura P.Fenwick publikoval v práci [Fen96] novou metodu pro efektivní operace s kumulovanými četnostmi. Použitou datovou strukturu budeme v této práci označovat jako Fenwickova datová struktura (FDS). Základní myšlenkou této metody je skutečnost, že podobně jako 33

34 Tabulka 6.1: Fenwickova datová struktura pozice s c s l s h s backward(s) f orward(s) rozsah c i F[s] F[s] po inc(3) je celé číslo součtem nějakých mocnin dvojky, tak je kumulovaná četnost součtem jiných kumulovaných četností. Pro popis FDS nejprve definujme: size(s) = max{2 v,kde s mod 2 v = 0 pro v N} forward(s) = s + size(s) backward(s) = s size(s) Fenwickova datová struktura pracuje s tzv. částečnou kumulovanou četností, která je pro symbol i definována následovně: F[s] = s c i i=backward(s)+1 Tabulka 6.1 uvádí příklad hodnot částečných kumulovaných četností FDS. Fenwickovu datovou strukturu lze znázornit také stromem, jak ukazuje aktualizační strom pro tabulku 6.1 na obrázku 6.1. Hrany vedoucí z uzlu s směrem doprava nahoru znázorňují operaci f orward(s), podle které probíhá procedura increment_count(s) (algoritmus 15). Algoritmus 14 Fenwick: get_cumul(s) result 0 i s while i > 0 do result result + F[i] i backward(i) end while return result 34

35 Obrázek 6.1: Fenwick: aktualizační strom Z definice víme, že h s = F[s] + h backward(s) a tedy h s = F[s] + F[backward(s)] + F[backward(backward(s))] +..., což nám dává návod, jak z částečné kumulované četnosti spočítat skutečnou kumulovanou četnost, jak zobrazuje algoritmus 14. Algoritmus 15 Fenwick: increment_count(s) i s while i < n do F[i] F[i] + 1 i forward(i) end while Při aktualizaci kumulovaných četností nejprve zvýšíme četnost symbolu s a poté postupujeme iterativně po F[s], F[forward(s)], F[forward(forward(s))],..., což dává logaritmický počet volání a tedy složitost aktualizace O(log(n)). Aktualizační proceduru zobrazuje algoritmus 15. Algoritmus 16 Fenwick: get_symbol(target) start 0 mid n 2 while mid 1 do if start + mid < n then target target F[start + mid] start start + mid end if mid mid 2 end while Procedura get_symbol, která slouží k nalezení symbolu, jež přísluší k dané kumulované frekvenci, je založena na modifikovaném binárním vyhledávání, jak je zobrazeno v algoritmu

36 Tabulka 6.2: Moffatova datová struktura pozice s c s l s h s backward(s) f orward(s) rozsah c i M[s] M[s] po inc(3) Obrázek 6.2: Moffat: aktualizační strom Moffatova datová struktura Tuto metodu publikoval A. Moffat v práci [Mof99] jako rozvinutí Fenwickovy metody. Obě metody sdílí podobné myšlenky - Moffatova datová struktura (MDS) také používá pole částečných kumulovaných četností, které se však počítají odlišně, jak ukazuje následující definice: M[s] = forward(s) 1 Tabulka 6.2 uvádí příklad hodnot částečných kumulovaných četností MDS. Obrázek 6.2 znázorňuje aktualizačním stromem Moffatovu datovou strukturu z tabulky 6.2. Hrany vedoucí z uzlu s směrem doleva nahoru znázorňují operaci backward(s), podle které probíhá operace increment_count(s) (algoritmus 19). Postup výpočtu kumulované četnosti z částečné kumulované četnosti zobrazuje algoritmus 17. Pro výpočet spodní meze l s je nutné provést dva kroky. V [Mof99] Moffat ukazuje, že tato procedura má časovou složitost O(log(s)). Algoritmus 18 pro proceduru get_symbol funguje na stejném principu jako odpovídající 36 i=s c i

Komprese dat (Komprimace dat)

Komprese dat (Komprimace dat) Komprese dat (Komprimace dat) Př.: zakódovat slovo ARARAUNA K K 2 četnost absolutní relativní A 4,5 N,25 R 2,25 U,25 kód K : kód K 2 :... 6 bitů... 4 bitů prefixový kód: žádné kódové slovo není prefixem

Více

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky Komprese dat Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI přednášky Statistické metody Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 1 / 23 Tunstallův

Více

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky Komprese dat Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI přednášky Slovníkové metody Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 1 / 23 Slovníkové

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

Více

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky

Více

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty Data v počítači Informační data (elementární datové typy) Logické hodnoty Znaky Čísla v pevné řádové čárce (celá čísla) v pohyblivé (plovoucí) řád. čárce (reálná čísla) Povelová data (instrukce programu)

Více

Časová a prostorová složitost algoritmů

Časová a prostorová složitost algoritmů .. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová

Více

Algoritmy komprese dat

Algoritmy komprese dat Algoritmy komprese dat Slovníkové metody Phillip Walter Katz (1962-2000) 2.12.2015 NSWI072-10 Slovníkové metody komprese dat Idea opakující se fráze uloženy do slovníku výskyty fráze v textu ukazatel do

Více

Dynamické programování

Dynamické programování Dynamické programování prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)

Více

Binární vyhledávací stromy pokročilé partie

Binární vyhledávací stromy pokročilé partie Binární vyhledávací stromy pokročilé partie KMI/ALS lekce Jan Konečný 30.9.204 Literatura Cormen Thomas H., Introduction to Algorithms, 2nd edition MIT Press, 200. ISBN 0-262-5396-8 6, 3, A Knuth Donald

Více

[1] samoopravné kódy: terminologie, princip

[1] samoopravné kódy: terminologie, princip [1] Úvod do kódování samoopravné kódy: terminologie, princip blokové lineární kódy Hammingův kód Samoopravné kódy, k čemu to je [2] Data jsou uložena (nebo posílána do linky) kodérem podle určitého pravidla

Více

Dijkstrův algoritmus

Dijkstrův algoritmus Dijkstrův algoritmus Hledání nejkratší cesty v nezáporně hranově ohodnoceném grafu Necht je dán orientovaný graf G = (V, H) a funkce, která každé hraně h = (u, v) H přiřadí nezáporné reálné číslo označované

Více

Návrh Designu: Radek Mařík

Návrh Designu: Radek Mařík 1. 7. Najděte nejdelší rostoucí podposloupnost dané posloupnosti. Použijte metodu dynamického programování, napište tabulku průběžných délek částečných výsledků a tabulku předchůdců. a) 5 8 11 13 9 4 1

Více

KOMPRESE OBRAZŮ. Václav Hlaváč, Jan Kybic. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání.

KOMPRESE OBRAZŮ. Václav Hlaváč, Jan Kybic. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání. 1/25 KOMPRESE OBRAZŮ Václav Hlaváč, Jan Kybic Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání hlavac@fel.cvut.cz http://cmp.felk.cvut.cz/ hlavac KOMPRESE OBRAZŮ, ÚVOD

Více

Univerzita Karlova v Praze. Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE. Bc. Lukáš Unger. Vylepšení víceproudé komprese

Univerzita Karlova v Praze. Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE. Bc. Lukáš Unger. Vylepšení víceproudé komprese Univerzita Karlova v Praze Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE Bc. Lukáš Unger Vylepšení víceproudé komprese Katedra softwarového inženýrství Vedoucí diplomové práce: RNDr. Michal Žemlička, Ph.D.

Více

Algoritmy komprese dat

Algoritmy komprese dat Algoritmy komprese dat Úvod do teorie informace Claude Shannon (1916 2001) 5.11.2014 NSWI072-7 Teorie informace Informace Co je to informace? Můžeme informaci měřit? Existují teoretické meze pro délku

Více

Komprese a dotazování nad XML dokumenty

Komprese a dotazování nad XML dokumenty Komprese a dotazování nad XML dokumenty Prezentace diplomové práce Lukáš Skřivánek České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů květen 2007 Vedoucí práce: Ing. Miroslav

Více

Stromy, haldy, prioritní fronty

Stromy, haldy, prioritní fronty Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík

Více

Kompresní techniky. David Bařina. 15. února David Bařina Kompresní techniky 15. února / 37

Kompresní techniky. David Bařina. 15. února David Bařina Kompresní techniky 15. února / 37 Kompresní techniky David Bařina 15. února 2013 David Bařina Kompresní techniky 15. února 2013 1 / 37 Obsah 1 Pojmy 2 Jednoduché techniky 3 Entropická kódování 4 Slovníkové metody 5 Závěr David Bařina Kompresní

Více

Informační systémy ve zdravotnictví

Informační systémy ve zdravotnictví Informační systémy ve zdravotnictví ZS 2008/2009 Zoltán Szabó Tel.: (+420) 312 608 207 E-mail: szabo@fbmi.cvut.cz č.dv.: 504, 5.p Dnešní přednáška Kódování, komprese 2 1 Komprese dat Cíl komprese: redukovat

Více

Základní datové struktury III: Stromy, haldy

Základní datové struktury III: Stromy, haldy Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní

Více

KOMPRESE DAT ARNOŠT VEČERKA KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO

KOMPRESE DAT ARNOŠT VEČERKA KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO KOMPRESE DAT ARNOŠT VEČERKA VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM A STÁTNÍM ROZPOČTEM ČESKÉ REPUBLIKY

Více

Algoritmy I. Číselné soustavy přečíst!!! ALGI 2018/19

Algoritmy I. Číselné soustavy přečíst!!! ALGI 2018/19 Algoritmy I Číselné soustavy přečíst!!! Číselné soustavy Každé číslo lze zapsat v poziční číselné soustavě ve tvaru: a n *z n +a n-1 *z n-1 +. +a 1 *z 1 +a 0 *z 0 +a -1 *z n-1 +a -2 *z -2 +.. V dekadické

Více

7. Rozdělení pravděpodobnosti ve statistice

7. Rozdělení pravděpodobnosti ve statistice 7. Rozdělení pravděpodobnosti ve statistice Statistika nuda je, má však cenné údaje, neklesejte na mysli, ona nám to vyčíslí Jednou z úloh statistiky je odhad (výpočet) hodnot statistického znaku x i,

Více

Komprese DNA pomocí víceproudé komprese a predikce báz. Jan Jelínek, Radek Miček

Komprese DNA pomocí víceproudé komprese a predikce báz. Jan Jelínek, Radek Miček Komprese DNA pomocí víceproudé komprese a predikce báz Jan Jelínek, Radek Miček Víceproudá komprese angl. Multistream compression (MSC) statistická metoda autoři: Kochánek, Lánský, Uzel, Žemlička lze použít

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Vyhledávání, vkládání, odstraňování Vyhledání hodnoty v nesetříděném poli Vyhledání hodnoty v setříděném poli Odstranění hodnoty z pole Vkládání hodnoty do pole Verze pro akademický

Více

Architektury počítačů a procesorů

Architektury počítačů a procesorů Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní

Více

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 Úlohy- 2.cvičení 1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 2. Převeďte dané desetinné číslo do dvojkové soustavy (DEC -> BIN): a) 0,8125 10 b) 0,35 10

Více

Základní jednotky používané ve výpočetní technice

Základní jednotky používané ve výpočetní technice Základní jednotky používané ve výpočetní technice Nejmenší jednotkou informace je bit [b], který může nabývat pouze dvou hodnot 1/0 (ano/ne, true/false). Tato jednotka není dostatečná pro praktické použití,

Více

Úvod do programování 7. hodina

Úvod do programování 7. hodina Úvod do programování 7. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Syntax Znaky Vlastní implementace

Více

TECHNICKÁ UNIVERZITA V LIBERCI

TECHNICKÁ UNIVERZITA V LIBERCI TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky a mezioborových inženýrských studií Komprese měřených dat v 0.1 Liberec 2007 Viktor Bubla Obsah 1 Proč komprimace? 2 2 Filosofie základních komprimačních

Více

Kódováni dat. Kódy používané pro strojové operace

Kódováni dat. Kódy používané pro strojové operace Kódováni dat Před zpracováním dat například v počítači je třeba znaky převést do tvaru, kterému počítač rozumí, tj. přiřadit jim určité kombinace bitů. Tomuto převodu se říká kódování. Kód je předpis pro

Více

KOMPRESE OBRAZŮ. Václav Hlaváč. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání. hlavac@fel.cvut.

KOMPRESE OBRAZŮ. Václav Hlaváč. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání. hlavac@fel.cvut. 1/24 KOMPRESE OBRAZŮ Václav Hlaváč Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání hlavac@fel.cvut.cz http://cmp.felk.cvut.cz/ hlavac KOMPRESE OBRAZŮ, ÚVOD 2/24 Cíl:

Více

Poslední nenulová číslice faktoriálu

Poslední nenulová číslice faktoriálu Poslední nenulová číslice faktoriálu Kateřina Bambušková BAM015, I206 Abstrakt V tomto článku je popsán a vyřešen problém s určením poslední nenulové číslice faktoriálu přirozeného čísla N. Celý princip

Více

Algoritmy a datové struktury

Algoritmy a datové struktury Algoritmy a datové struktury Stromy 1 / 32 Obsah přednášky Pole a seznamy Stromy Procházení stromů Binární stromy Procházení BS Binární vyhledávací stromy 2 / 32 Pole Hledání v poli metodou půlení intervalu

Více

ZÁPADOČESKÁ UNIVERZITA V PLZNI

ZÁPADOČESKÁ UNIVERZITA V PLZNI ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA PEDAGOGICKÁ KATEDRA VÝPOČETNÍ A DIDAKTICKÉ TECHNIKY KOMPONENTY PRO VÝUKOVÝ ELEKTRONICKÝ MATERIÁL - KOMPRESE V OBLASTI POČÍTAČŮ BAKALÁŘSKÁ PRÁCE Lukáš Smutný Přírodovědná

Více

Dynamické datové struktury III.

Dynamické datové struktury III. Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované

Více

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Jak v Javě primitivní datové typy a jejich reprezentace BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Obsah Celočíselný datový typ Reálný datový typ Logický datový typ, typ Boolean

Více

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Algoritmus pro hledání nejkratší cesty orientovaným grafem 1.1 Úvod Algoritmus pro hledání nejkratší cesty orientovaným grafem Naprogramoval jsem v Matlabu funkci, která dokáže určit nejkratší cestu v orientovaném grafu mezi libovolnými dvěma vrcholy. Nastudoval

Více

Kódy pro odstranění redundance, pro zabezpečení proti chybám. Demonstrační cvičení 5 INP

Kódy pro odstranění redundance, pro zabezpečení proti chybám. Demonstrační cvičení 5 INP Kódy pro odstranění redundance, pro zabezpečení proti chybám Demonstrační cvičení 5 INP Princip kódování, pojmy Tady potřebujeme informaci zabezpečit, utajit apod. zpráva 000 111 000 0 1 0... kodér dekodér

Více

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ Michal Kořenář 1 Abstrakt Rozvoj výpočetní techniky v poslední době umožnil také rozvoj výpočetních metod, které nejsou založeny na bázi

Více

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D.

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D. Algoritmizace diskrétních simulačních modelů Ing. Michal Dorda, Ph.D. 1 Úvodní poznámky Při programování simulačních modelů lze hlavní dílčí problémy shrnout do následujících bodů: 1) Zachycení statických

Více

IB111 Úvod do programování skrze Python

IB111 Úvod do programování skrze Python Vyhledávání, řazení, složitost IB111 Úvod do programování skrze Python 2012 Otrávené studny 8 studen, jedna z nich je otrávená laboratorní rozbor dokáže rozpoznat přítomnost jedu ve vodě je drahý (je časově

Více

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy Lukáš Havrlant Univerzita Palackého 10. ledna 2014 Primární zdroj Jiří Adámek: Foundations of Coding. Strany 137 160. Na webu ke stažení, heslo:

Více

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615) IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná

Více

Datové struktury 2: Rozptylovací tabulky

Datové struktury 2: Rozptylovací tabulky Datové struktury 2: Rozptylovací tabulky prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy

Více

Algoritmy výpočetní geometrie

Algoritmy výpočetní geometrie Algoritmy výpočetní geometrie prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)

Více

Semestrální práce 2 znakový strom

Semestrální práce 2 znakový strom Semestrální práce 2 znakový strom Ondřej Petržilka Datový model BlockFileRecord Bázová abstraktní třída pro záznam ukládaný do blokového souboru RhymeRecord Konkrétní třída záznamu ukládaného do blokového

Více

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

II. Úlohy na vložené cykly a podprogramy

II. Úlohy na vložené cykly a podprogramy II. Úlohy na vložené cykly a podprogramy Společné zadání pro příklady 1. - 10. začíná jednou ze dvou možností popisu vstupních dat. Je dána posloupnost (neboli řada) N reálných (resp. celočíselných) hodnot.

Více

63. ročník Matematické olympiády 2013/2014

63. ročník Matematické olympiády 2013/2014 63. ročník Matematické olympiády 2013/2014 Úlohy ústředního kola kategorie P 2. soutěžní den Na řešení úloh máte 4,5 hodiny čistého času. Při soutěži je zakázáno používat jakékoliv pomůcky kromě psacích

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 1. dubna 2014 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

Základy algoritmizace. Hašování

Základy algoritmizace. Hašování Základy algoritmizace Hašování Problematika hašování Hašování - nástroj na jednoduchý způsob "zakódování vstupních dat. Vstupní data jsou zpracována hašovací funkcí jsou jistým způsobem komprimována. Relativně

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)

Více

Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.

Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Jednoduché cykly Tento oddíl obsahuje úlohy na první procvičení práce s cykly. Při řešení každé ze zde uvedených úloh stačí použít vedle podmíněných příkazů jen jediný cyklus. Nepotřebujeme používat ani

Více

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 1 / 23 Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 2 / 23 biologové často potřebují najít často se opakující sekvence DNA tyto sekvence bývají relativně krátké,

Více

6 Ordinální informace o kritériích

6 Ordinální informace o kritériích 6 Ordinální informace o kritériích Ordinální informací o kritériích se rozumí jejich uspořádání podle důležitosti. Předpokládejme dále standardní značení jako v předchozích cvičeních. Existují tři základní

Více

Komprese videa Praha 2010 Účel komprese Snížení zátěže přenosového média Zmenšení objemu dat pro uložení Metody komprese obrazu Redundance Irelevance Redundantní složka část informace, po jejíž odstranění

Více

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová

Více

Dokumentace zápočtového programu (PRG030) KOMPRESE TEXTU

Dokumentace zápočtového programu (PRG030) KOMPRESE TEXTU Dokumentace zápočtového programu (PRG030) KOMPRESE TEXTU Petr Koupý, INF 1/X/32 Anotace Program je primárně navržen ke komprimování textových souborů. Protože však místo textových znaků pracuje přímo s

Více

Prohledávání do šířky = algoritmus vlny

Prohledávání do šířky = algoritmus vlny Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé

Více

Úvod do informatiky. Miroslav Kolařík. Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008.

Úvod do informatiky. Miroslav Kolařík. Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008. Úvod do informatiky přednáška čtvrtá Miroslav Kolařík Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008. Obsah 1 Pojem relace 2 Vztahy a operace s (binárními) relacemi

Více

Číselné soustavy v mikroprocesorové technice Mikroprocesorová technika a embedded systémy

Číselné soustavy v mikroprocesorové technice Mikroprocesorová technika a embedded systémy Ústav radioelektroniky Vysoké učení technické v Brně Číselné soustavy v mikroprocesorové technice Mikroprocesorová technika a embedded systémy Přednáška 8 doc. Ing. Tomáš Frýza, Ph.D. listopad 2012 Obsah

Více

Automatická segmentace slov s pomocí nástroje Affisix. Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz

Automatická segmentace slov s pomocí nástroje Affisix. Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz Automatická segmentace slov s pomocí nástroje Affisix Michal Hrušecký, Jaroslava Hlaváčová Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz Motivace Při zpracování přirozeného jazyka nikdy nemůžeme mít

Více

Binární soubory (datové, typované)

Binární soubory (datové, typované) Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Grafové úlohy Daniela Szturcová Tento

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

Vzdálenost uzlů v neorientovaném grafu

Vzdálenost uzlů v neorientovaném grafu Vzdálenosti a grafy Vzdálenost uzlů v neorientovaném grafu Je dán neorientovaný neohodnocený graf G = (V,E,I) vzdálenost uzlů u a v v neorientovaném souvislém grafu G je délka nejkratší cesty spojující

Více

ČÍSELNÉ SOUSTAVY PŘEVODY

ČÍSELNÉ SOUSTAVY PŘEVODY ČÍSELNÉ SOUSTAVY V každodenním životě je soustava desítková (decimální, dekadická) o základu Z=10. Tato soustava používá číslice 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9, není však vhodná pro počítače nebo číslicové

Více

Dynamické datové struktury IV.

Dynamické datové struktury IV. Dynamické datové struktury IV. Prioritní fronta. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 5. dubna 2017 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Inženýrská statistika pak představuje soubor postupů a aplikací teoretických principů v oblasti inženýrské činnosti.

Inženýrská statistika pak představuje soubor postupů a aplikací teoretických principů v oblasti inženýrské činnosti. Přednáška č. 1 Úvod do statistiky a počtu pravděpodobnosti Statistika Statistika je věda a postup jak rozvíjet lidské znalosti použitím empirických dat. Je založena na matematické statistice, která je

Více

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů Stavový prostor a jeho prohledávání SP = formalismus k obecnějšímu uchopení a vymezení problému, který spočívá v nalezení posloupnosti akcí vedoucích od počátečního stavu úlohy (zadání) k požadovanému

Více

Struktura a architektura počítačů (BI-SAP) 5

Struktura a architektura počítačů (BI-SAP) 5 Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Struktura a architektura počítačů (BI-SAP) 5 doc. Ing. Hana Kubátová, CSc. Katedra číslicového návrhu Fakulta informačních technologii

Více

Rekurzivní algoritmy

Rekurzivní algoritmy Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS

Více

12 Metody snižování barevného prostoru

12 Metody snižování barevného prostoru 12 Metody snižování barevného prostoru Studijní cíl Tento blok je věnován základním metodám pro snižování barevného rozsahu pro rastrové obrázky. Postupně zde jsou vysvětleny důvody k použití těchto algoritmů

Více

Architektura počítačů

Architektura počítačů Architektura počítačů Studijní materiál pro předmět Architektury počítačů Ing. Petr Olivka katedra informatiky FEI VŠB-TU Ostrava email: petr.olivka@vsb.cz Ostrava, 2010 1 1 Architektura počítačů Pojem

Více

Algoritmizace. 1. Úvod. Algoritmus

Algoritmizace. 1. Úvod. Algoritmus 1. Úvod Algoritmizace V dnešní době již počítače pronikly snad do všech oblastí lidské činnosti, využívají se k řešení nejrůznějších úkolů. Postup, který je v počítači prováděn nějakým programem se nazývá

Více

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky Otázka 20 A7B36DBS Zadání... 1 Slovníček pojmů... 1 Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky... 1 Zadání Relační DB struktury sloužící k optimalizaci

Více

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA Jan Schmidt 2011 Katedra číslicového návrhu Fakulta informačních technologií České vysoké učení technické v Praze Zimní semestr 2011/12 MI-PAA EVROPSKÝ SOCIÁLNÍ FOND PRAHA & EU: INVESTUJENE DO VAŠÍ BUDOUCNOSTI

Více

1. D Y N A M I C K É DAT O V É STRUKTUR Y

1. D Y N A M I C K É DAT O V É STRUKTUR Y 1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové

Více

TÉMATICKÝ OKRUH Softwarové inženýrství

TÉMATICKÝ OKRUH Softwarové inženýrství TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího

Více

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU Příručka uživatele a programátora SofCon spol. s r.o. Střešovická 49 162 00 Praha 6 tel/fax: +420 220 180 454 E-mail: sofcon@sofcon.cz www: http://www.sofcon.cz

Více

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy Stromy úvod Stromy Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy Neorientovaný strom Orientovaný strom Kořenový orientovaný

Více

Prioritní fronta, halda

Prioritní fronta, halda Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26 Prioritní fronta Halda Heap sort 2 / 26 Prioritní fronta (priority queue) Podporuje

Více

Optimalizace & soft omezení: algoritmy

Optimalizace & soft omezení: algoritmy Optimalizace & soft omezení: algoritmy Soft propagace Klasická propagace: eliminace nekonzistentních hodnot z domén proměnných Soft propagace: propagace preferencí (cen) nad k-ticemi hodnot proměnných

Více

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů: Úloha č.: max. bodů: skut. bodů: 1 2 3 4 5 6 součet cvičení celkem 20 12 20 20 14 14 100 známka UPOZORNĚNÍ : a) Písemná zkouška obsahuje 6 úloh, jejichž řešení musí být vepsáno do připraveného formuláře.

Více

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být

Více

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase -stromy a rozpoznávání intervalových grafů v lineárním čase ermutace s předepsanými intervaly Označme [n] množinu {1, 2,..., n}. Mějme permutaci π = π 1, π 2,..., π n množiny [n]. Řekneme, že množina S

Více

Algoritmy na ohodnoceném grafu

Algoritmy na ohodnoceném grafu Algoritmy na ohodnoceném grafu Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy? Dijkstrův algoritmus s t Jak najít minimální kostru grafu? Jarníkův a Kruskalův algoritmus

Více

59. ročník Matematické olympiády 2009/2010

59. ročník Matematické olympiády 2009/2010 59. ročník Matematické olympiády 2009/2010 Úlohy ústředního kola kategorie P 1. soutěžní den Na řešení úloh máte 4,5 hodiny čistého času. Řešení každé úlohy pište na samostatný list papíru. Při soutěži

Více

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 20. září 2016 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší

Více

Technická kybernetika. Obsah. Principy zobrazení, sběru a uchování dat. Měřicí řetězec. Principy zobrazení, sběru a uchování dat

Technická kybernetika. Obsah. Principy zobrazení, sběru a uchování dat. Měřicí řetězec. Principy zobrazení, sběru a uchování dat Akademický rok 2016/2017 Připravil: Radim Farana Technická kybernetika Principy zobrazení, sběru a uchování dat 2 Obsah Principy zobrazení, sběru a uchování dat strana 3 Snímač Měřicí řetězec Měřicí obvod

Více

1 Nejkratší cesta grafem

1 Nejkratší cesta grafem Bakalářské zkoušky (příklady otázek) podzim 2014 1 Nejkratší cesta grafem 1. Uvažujte graf s kladným ohodnocením hran (délka). Definujte formálně problém hledání nejkratší cesty mezi dvěma uzly tohoto

Více

Informace, kódování a redundance

Informace, kódování a redundance Informace, kódování a redundance INFORMACE = fakt nebo poznatek, který snižuje neurčitost našeho poznání (entropii) DATA (jednotné číslo ÚDAJ) = kódovaná zpráva INFORAMCE = DATA + jejich INTERPRETACE (jak

Více