01_bwt_kompresija

32
Algoritmi i Strukture Podataka IR2ASP IR2ASP I I 1. Generatori slučajnih 1. Generatori slučajnih brojeva brojeva 2. K 2. K ompresija ompresija (RLE, LZW) (RLE, LZW) 3. BWT algoritam 3. BWT algoritam

Upload: aleksandra-djuric

Post on 23-Jan-2016

10 views

Category:

Documents


0 download

DESCRIPTION

bwt

TRANSCRIPT

Page 1: 01_BWT_Kompresija

Algoritmi i Strukture PodatakaIR2ASPIR2ASP

II

1. Generatori slučajnih brojeva1. Generatori slučajnih brojeva

2. K2. Kompresijaompresija (RLE, LZW) (RLE, LZW)

3. BWT algoritam3. BWT algoritam

Page 2: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 2

Generatori pseudoslučajnih brojeva

• Generator slučajnih brojeva: meri fizičku veličinuza koju se pretpostavlja da je slučajne prirode

• Generator pseudoslučajnih brojeva: koristi neki algoritam(najčešće baziran na celobrojnoj aritmetici)

• Pseudo = nije pravi : bazira se na algoritmudeterminizam

• Realizacija: hardverska ili softverska

Page 3: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 3

Generatori pseudoslučajnih brojeva

• Kvalitetan generator pseudoslučajnih brojeva– dobre statističke karakteristike (uniformna raspodela generisanih

brojeva)– velika perioda ponavljanja sekvence

• Primena– simulacije realnih sistema (Monte-Carlo metode)– kriptografija– statističke analize– sastavni su deo generatora pseudoslučajnih brojeva po drugim

raspodelama

– Bibliotečke funkcije jezika C– rand() i srand() : loših karakteristika,

prihvatljivih samo za nebitne primene (video-igre)

Page 4: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 4

Generatori pseudoslučajnih brojeva - LKG

• Linearan kongruentan generator (LKG) periode m

• (Donald Knuth) Perioda je m ako :– c i m su uzajamno prosti– a-1 je deljivo svim prostim činiocima m– a-1 je umnožak 4 ako je m umnožak 4

1

0

( ) mod

0 : moduo

0 : množilac

0 : inkrement

0 : "klica" (eng. )

n nX a X c m

m

a m

c m

X m seed

Page 5: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 5

Generatori pseudoslučajnih brojeva - LKG

• Predložene kombinacije (32-bitni računar, m=232)

– a = 429493445, c = 907633385 (Knuth)

– a = 1664525, c = 1013904223 (Numerical Recipes in C)

• Kod (vraća realan broj od 0 do 1):

unsigned long u;

unsigned long iurng(void) {

return u = 429493445 * u + 907633385;

}

void SetSeed(unsigned long seed)

{

u = seed;

}

double Randomd(void)

{

return( iurng() / 4294967296.);

}

Page 6: 01_BWT_Kompresija

Poređenje: 100 000 tačaka (parovi X i Y)

Bibliotečka funkcija randVisual C++ 2008

LKG (Knuth)

Page 7: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 7

Generatori pseudoslučajnih brojeva - BBS

• Blum Blum ShubXn+1 = (Xn)2 mod M, gde je M=p*q,p i q su prosti brojevi kongruentni sa 3 po modulu 4

– Nakon svake iteracije uzima se nekoliko bita Xn

kao deo rezultata (potrebno je više iteracija da bi se dobio jedan pseudoslučajni broj)

• Generator je relativno spor (u odnosu na druge metode)• Odlične karakteristike za kriptografiju, ne i za simulacije

(zbog sporosti)

Page 8: 01_BWT_Kompresija

• Primer: p=11, q=19, X0=3, M=p*q=209.

=> X1=9, X2=81, X3=82, X4=36, X5=42, X6=92...

• Uzimamo npr. samo bit parnosti svakog člana, pa je generisana sekvenca: 011010...

• Ako uzmemo najniži bit generisana sekvenca: 110000...

• Ove i slične sekvence se mogu kombinovati da se dobije

pseudoslučajni broj

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 8

Generatori pseudoslučajnih brojeva - BBS

Page 9: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 9

Generatori pseudoslučajnih brojeva - FGK

• Fibonačijev generator sa kašnjenjem(eng. Lagged Fibonacci generator - LFG)– Koristi način određivanja Fibonačijevih brojeva kao ideju:

Fn = Fn-1 + Fn-2

• perioda zavisi od odabrane operacije

• j i k ne mogu da se biraju proizvoljno(postoji objavljen spisak)

• problematična inicijalizacija (zavisno od vrednosti j i k)

( op ) mod ,0

op je neka operacija (+ - * / xor)

n n j n kS S S m j k

Page 10: 01_BWT_Kompresija

Zadatak

• Koristeći LKG generator implementirati funkciju coin() koja sa približno jednakom verovatnoćom vraća vrednosti 0 ili 1. Koristeći funkciju coin() implementirati funkciju cube() koja simulira bacanje kocke, tj. vraća vrednost od 1 do 6 sa približno podjednakim verovatnoćama.

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 10

Page 11: 01_BWT_Kompresija

void InitCoin(unsigned long seed){ SetSeed(seed); //svodi se na inicijalizaciju LKG generatora }

int coin(){ double i=Randomd(); if(i<0.5) return 0; else return 1;}

//ideja je da slučajno generišemo svaki bitint cube(){ int i=coin(); i = i*2 + coin(); i = i*2 + coin(); if(i >= 6) return cube(); // ponovo pozovemo funkciju ako je rezultat // veći nego što treba else return i+1;}

U test programu, u 60.000 poziva funkcije cube(), povratna vrednost iznosila je:1 – 9.989 puta 4 – 9.972 puta2 – 10.000 puta 5 – 9.924 puta3 – 10.047 puta 6 – 10.068 puta

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 11

Page 12: 01_BWT_Kompresija

Zadatak

• Napisati program koji izračunava približnu vrednostbroja π primenom generatora slučajnih brojeva.

R=1

Ideja:• Generisati slučajne brojeve kao

koordinate tačaka u ravni(u prvom kvadrantu)

• Odnos broja tačaka u kvadratu jedinične dužine stranicai četvrtini kružnicejediničnog poluprečnikadaje traženu (približnu) vrednost.

Page 13: 01_BWT_Kompresija

RešenjePROGRAM RAND(output);CONST MAX = 10000;VAR i, j : longint;

FUNCTION pi(i : longint) : real;VAR x, y,d : real; u_krugu, j : longint;BEGIN u_krugu := 0; d := MAX; FOR j := 0 TO i DO BEGIN x := random(MAX)/d; y := random(MAX)/d; if sqr(x)+sqr(y)<=1.0 THEN u_krugu := u_krugu+1; END; pi := 4.0 * u_krugu / iEND;

BEGIN j := 1; FOR i := 1 to 7 DO BEGIN j:=j*10; writeln(output, pi(j)); ENDEND.

Rezultati:

i TP 7.0 VC++ 9

10 4 3.6

100 3.16 3.08

1000 3.152 3.084

10000 3.1552 3.1132

100000 3.14324 3.13984

1000000 3.141272 3.14014

Page 14: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 14

Run-length kompresija (RLE)

• Veoma jednostavan metod kompresije• Slab stepen kompresije• Bez gubitaka• Primena: audio zapisi, statične slike (BMP, ILBM)

• Ideja: više istih ulaznih simbola s pretvoriti u kombinaciju(broj_pojavljivanja, s)

• Primer: AAABBBBBAAB 3A5B2A1B

Page 15: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 15

Run-length kompresija (RLE)

• Problem: nedostatak sekvenci istih simbolasmanjuje stepen kompresije

• Primer: ABAB 1A1B1A1B (umesto 4 šalje se 8 simbola)

• Rešenje:– ako je broj pojavljivanja pozitivan,

naredni simbol ponoviti toliko puta– ako je broj pojavljivanja negativan,

direktno prepisati toliko narednih ulaznih simbola

• Primer: AAAABAB 4A-3BAB

Page 16: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 16

Run-length kompresija (RLE)

void kompresija(char *poruka, char *izlaz) {char c = *poruka, *pointer;int broj; while(c) { broj = 0; if(c==*(++poruka)) {

while(*poruka && c==*poruka && broj<127){

broj++;

poruka++;

}

*izlaz++=(char)broj;

*izlaz++=c;

c=*poruka;

}

Page 17: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 17

Run-length kompresija (RLE) else {

pointer=izlaz++;

while(*poruka && c!=*poruka && broj<127){

broj++; *izlaz++=c; c=*poruka++;

}

if(!*poruka){

broj++; *izlaz++=c; c=*poruka;

}

else poruka--; 

*pointer=(char)(-broj);

}

}

*izlaz = 0;}

Page 18: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 18

Run-length kompresija (RLE)

void dekompresija(char *poruka, char *izlaz){char c = *poruka;int i, n;

while( *poruka ) { if( *poruka > 0 ) { n = *poruka++;

for(i = 0; i <= n; i++) *izlaz++ = *poruka;

poruka++; }

Page 19: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 19

Run-length kompresija (RLE)

else { n = -*poruka++;

for(i = 0; i < n; i++) *izlaz++ = *poruka++; } }

*izlaz = 0;}

Page 20: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 20

Run-length kompresija (RLE)

#include <stdio.h>

void main() {char *ulaz = "ABABAA";char kompr[256];char dekompr[256];

kompresija(ulaz, kompr); dekompresija(kompr, dekompr);

printf("Ulazna poruka: %s\n", ulaz); printf("Nakon dekompresije: %s\n", dekompr);}

Page 21: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 21

Burrows-Wheeler Transform (BWT) [1994]

• Uočen problem nedostatka sekvence istih simbolamože da se ublaži pred-obradom ulaznog niza

• Ulazni niz simbola se transformiše tako da sekod ponavljanih sekvenci od više simbolapojedini simboli grupišu stvarajući duže sekvence identičnih simbola

• Primer: ABABAB AAABBB

• Transformacija mora biti reverzibilna!

Page 22: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 22

Burrows-Wheeler Transform (BWT)

• Direktna transformacija– naprave se sve rotacije ulaznog niza simbola

i smeste se u matricu odgovarajuće veličine– izvrši se njihovo (leksikografsko) sortiranje– rezultat se nalazi u poslednjoj koloni matrice

• Primer: XBANANA@ (@ je oznaka kraja stringa)XBANANA@

@XBANANA

A@XBANAN

NA@XBANA

ANA@XBAN

NANA@XBA

ANANA@XB

BANANA@X

ANANA@XB

ANA@XBAN

A@XBANAN

BANANA@X

NANA@XBA

NA@XBANAXBANANA@

@XBANANA

SORTIRANJEBNNXAA@A

Page 23: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 23

Burrows-Wheeler Transform (BWT)

• Inverzna transformacija:– polazi od ulaznog niza i posmatra ga kao kolonu matrice– sukcesivno se vrši sortiranje matrice po vrstama

i dodavanje ulaznog niza kao krajnje leve kolone– polazni niz je onaj koji se završava znakom @

• Primer: ulazni niz BNNXAA@A

B

N

N

X

A

A

@

A

A

A

A

B

N

N

X

@

SORT.

BA

NA

NA

XB

AN

AN

@X

A@

DODAJ SORT.

AN

AN

A@

BA

NA

NA

XB

@X

DODAJ

BAN

NAN

NA@

XBA

ANA

ANA

@XB

A@X

Page 24: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 24

Burrows-Wheeler Transform (BWT)

... SORT ...

ANANA@XB ANA@XBAN A@XBANAN BANANA@X NANA@XBA NA@XBANA XBANANA@ @XBANANA

XBANANA@

• Nije neophodno da postoji poseban simbol @:prilikom direktne transformacije dovoljno je zapamtiti(kao poseban podatak) poziciju gde bi bio znak @

Page 25: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 25

LZW algoritam

• Kompresija/dekompresija podataka• Metoda je dobila naziv po autorima:

– Lempel i Ziv (1977-1978) osnovni algoritam– Welch (1984) unapređena verzija algoritma

• Ideja: uvesti nove simbole (proširena tabela simbola)koji zamenjuju nizove osnovnih i dodatih simbola

• Na primer: umesto da se niz simbola AB kodira vrednostima 65 66, kodiraće se vrednošću 256(vrednost van osnovnog opsega za kodove)

Page 26: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 26

LZW algoritam

• LZW koncepcija:– LZW algoritam kompresije zamenjuje znakovne nizove pojedinačnim

kodovima– Nema preliminarne analize ulaznog teksta– Svaki novi znakovni niz se dodaje tabeli znakovnih nizova– Ušteda se postiže kada je izlaz jedan kôd umesto znakovnog niza– Kôd znakovnog niza može biti proizvoljne dužine, ali mora biti duži od

kôda jednog znaka (proširen kôd)– Ako se koriste kodovi 0-255 za osnovni skup znakova,

onda se kôdovi počev od 256 koriste za znakovne nizove

• Rezultati– LZW algoritam je veoma dobar za tekstualne podatke - više od 50% kompresije– Kompresija bitmape ekrana daje odlične rezultate (GIF format)

Page 27: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 27

LZW – algoritam za kompresiju

STRING = getInputCharacter()WHILE (not EOF(input)) DO CHARACTER = getInputCharacter() IF ( TABLE.contains(STRING+CHARACTER) ) then STRING = STRING+CHARACTER ELSE OutputCode(STRING) TABLE.add(STRING+CHARACTER) STRING = CHARACTER END_IFEND_WHILEOutputCode(STRING)

Page 28: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 28

Zadatak 4

• Primenom LZW algoritma, izvršiti kompresiju znakovnog niza ”DADA_DA_DA_DA”, ako je data početna tabela sa kodovima simbola

simbol kod

D 0

A 1

_ 2

Page 29: 01_BWT_Kompresija

Zadatak 4 - rešenje

simbol kod

D 0

A 1

_ 2

InputInput STRINGSTRING STRINGSTRING+CHARACTER+CHARACTER Izlazni kodIzlazni kod Novi stringNovi string

DA 3

AD 4

DA_ 5

_D 6

DA_D 7

DA_DA 8

DD DD DD --

DADA_DA_DA_DA

AA DD DDAA 00 AA

DD AA AADD 11 DD

AA DD DDAA -- DADA

__ DADA DDA_A_ 33 __

DD __ __DD 22 DD

AA DD DADA -- DADA

__ DADA DA_DA_ -- DA_DA_

DD DA_DA_ DA_DDA_D 55 DD

AA DD DADA -- DADA

__ DADA DA_DA_ -- DA_DA_

DD DA_DA_ DA_DDA_D -- DA_DDA_D

AA DA_DDA_D DA_DADA_DA 77 AA

EOFEOF AA -- 11

Page 30: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 30

LZW – algoritam za dekompresiju

OLD_CODE = getInputCode()OutputStr(TABLE.translate(OLD_CODE))WHILE(not EOF(input)) DO NEW_CODE = getInputCode() if(not TABLE.contains(NEW_CODE)) then STRING = TABLE.translate(OLD_CODE) + CHARACTER else STRING = TABLE.translate(NEW_CODE) end_if outputStr(STRING) CHARACTER = firstCharacter(STRING) TABLE.add(TABLE.translate(OLD_CODE) + CHARACTER) OLD_CODE = NEW_CODEEND_WHILE

Page 31: 01_BWT_Kompresija

Elektrotehnički fakultet,Beograd

Algoritmi i Strukture Podataka 31

Zadatak 5

Izvršiti dekompresiju ulaznog niza kodova ”0132571”, ako je data početna tabela sa kodovima simbola.

simbol kod

D 0

A 1

_ 2

Page 32: 01_BWT_Kompresija

Zadatak 5 - rešenje

input OLD_CODE NEW_CODE STRING CHARACTER outputsimbol kod

D 0

A 1

_ 2

0132571

0 0 D

1 0 1 A A A

DA 3

AD 4

DA_ 5

_D 6

DA_D 7

DA_DA 8

3 1 3 DA D DA

2 3 2 _ _ _

5 2 5 DA_ D DA_

7 5 7 DA_D D DA_D

1 7 1 A A A