01_bwt_kompresija
DESCRIPTION
bwtTRANSCRIPT
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
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
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)
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
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.);
}
Poređenje: 100 000 tačaka (parovi X i Y)
Bibliotečka funkcija randVisual C++ 2008
LKG (Knuth)
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)
• 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
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
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
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
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.
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
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
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
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;
}
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;}
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++; }
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;}
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);}
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!
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
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
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 @
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)
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)
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)
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
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
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
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
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