Download - Kompresija tekstovnih datotek
![Page 1: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/1.jpg)
Jernej Golja, 2008
![Page 2: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/2.jpg)
Kompresija podatkov
Je postopek, kako enake podatke zapisati z manj zlogi.
Dve vrsti kompresije: lossless (brez izgube) in lossy (z izgubo) kompresija.
![Page 3: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/3.jpg)
Kompresija z izgubo
Primerna za datoteke, kjer vsaka informacija, ki predstavlja podatke, ni ključnega pomena (slika, zvok, govor …).
Kodiramo tako, da je končni rezultat še vedno dovolj dober za prejemnika.
Primeri: JPEG, MPEG, MP3, WMA …
![Page 4: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/4.jpg)
Kompresija brez izgube (1/2) Vse kar zakodiramo, moramo
odkodirati v prvotno obliko. Kje uporabljamo: tekstovne datoteke
(.txt), zagonske datoteke (.exe), tam kjer so prvotni podatki ključnega pomena.
V principu bi vsak lossless algoritem lahko deloval nad vsemi vrstami podatkov. Vendar?
![Page 5: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/5.jpg)
Kompresija brez izgube (2/2) Za različne vrste datotek različni
algoritmi kodiranja: Bolj smo specifični, bolj smo učinkoviti. Tekst, slika, zvok – vsak ima svoje lastnosti.
Uporabno tudi pri kriptiranju (odstranimo logične vzorce v datoteki).
Ne moremo garantirati kompresije za vsako datoteko (posebej, če je že bila kodirana).
![Page 6: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/6.jpg)
Huffmanovo kodiranje (1/6) Uporablja entropičen algoritem:
Vsak znak lahko zapišemo z drugačnim zapisom (različno število zlogov).
Uporabimo statistiko za izračun verjetnosti in frekvence.
Ustvari se prefix binarno drevo. Nobena vrednost lista v drevesu ne
predstavlja začetka vrednosti v drugem listu.
![Page 7: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/7.jpg)
Huffmanovo kodiranje (2/6) Koraki pri izdelavi drevesa:
Korake ponavljamo, dokler obstajata vsaj dva elementa za primerjat: 1. najdi dva najmanjša elementa (z
najmanjšo frekvenco) 2. seštej njuni frekvenci in jih združi v
vozlišče 3. odstrani elementa iz prejšnjega
seznama in upoštevaj vozlišče pri naslednjem iskanju
![Page 8: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/8.jpg)
Huffmanovo kodiranje (3/6) Primer: “ospo je ospo.”:
“o” (4)0.308
“j” (1)0.077
“e” (1)0.077
“.” (1)0.077
“s” (2)0.154
“p” (2)0.154
“ ” (2)0.154
0.154 0.308
0.385 0.615
1
0.231
![Page 9: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/9.jpg)
Huffmanovo kodiranje (4/6) Koraki pri izdelavi drevesa:
Vsem listom v drevesu dodamo primerno bitno kodo, glede na to kje se nahajajo.
![Page 10: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/10.jpg)
Huffmanovo kodiranje (5/6) Primer: “ospo je ospo.”:
“o” (4)0.30811
“j” (1)0.077000
“e” (1)0.077001
“.” (1)0.077010
“s” (2)0.154011
“p” (2)0.154100
“ ” (2)0.154101
0.154 0.308
0.385 0.615
1
0.231
0
0
00 0
0
1
1
111
1
![Page 11: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/11.jpg)
Huffmanovo kodiranje (6/6) Kaj smo dobili?
Binarno drevo listov z unikatnim bitnim zapisom svoje “kode”.
Večjo kot ima znak v izvorni datoteki frekvenco, manjšo bitno kodo mu dodelimo in obratno.
![Page 12: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/12.jpg)
Zapis kodirane datoteke (1/5) Drevo je za vsako datoteko unikatno, zato ga
moramo zapisati zraven. Zapisati moramo zgolj znak in binarno kodo Zraven pa zapišemo tudi št. izvornih znakov in odmik
glave, za lažje dekodiranje
Primer:
000|j001|e010|.|18|3
itn…
![Page 13: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/13.jpg)
Zapis kodirane datoteke (2/5) Manipulacija bitov
združujemo bitne kode naših znakov v zloge in le-te zapisujemo
![Page 14: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/14.jpg)
Zapis kodirane datoteke (3/5) Primer zapisa:
“o” (4)0.30811
“j” (1)0.077000
“e” (1)0.077001
“.” (1)0.077010
“s” (2)0.154011
“p” (2)0.154100
“ ” (2)0.154101
ospo je ospo.
11 011 100
1 byte
![Page 15: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/15.jpg)
Zapis kodirane datoteke (4/5) Manipulacija bitov
ponavljamo do konca pazimo na zadnji zlog, ker ponavadi ni
vseh 8 bitov zapisanih, zato mu dodamo lastne bite, kar s štetjem znakov upoštevamo pri dekodiranju.
![Page 16: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/16.jpg)
Zapis kodirane datoteke (5/5) Rezultat?
Odvisen od datoteke. najboljši v primeru velike količine enakih
znakov. najslabši ko je malo znakov in so vsi različni.
V povprečju vsaj 50% učinkovit pri naključnih podatkih (pri mojih lastnih testiranjih).
![Page 17: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/17.jpg)
Dekodiranje(1/2)
Iz glave ustvarimo enosmerno povezan seznam znakov z njihovimi bitnimi kodami.
Potem pa relativno enak način kot kodiranje: bite sestavljamo v vzorce, ki jih potem
primerjamo v našem seznamu. v kolikor najdemo vzorec, v datoteko
zapišemo njegov pravi znak.
![Page 18: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/18.jpg)
Slabosti & izboljšave
Moja implementacija: Zagotovo dela samo z znakovnim kodiranjem,
kjer je en znak predstavljen z enim zlogom (ANSI – ASCII).
Rešitev? Uporaba drugega tipa kot char, npr. int (4 zlogi – dovolj za UTF-8), itn.
Boljši zapis drevesa v “glavo” kodirane datoteke. Buffer za pisanje v datoteke (za hitrejše
delovanje)
Huffmanov algoritem: Ni primeren za real-time kompresijo, saj moramo
vsaj 2x skozi datoteko, da jo zakodiramo.
![Page 19: Kompresija tekstovnih datotek](https://reader036.vdocuments.pub/reader036/viewer/2022062300/5591d4b31a28abbe658b47bc/html5/thumbnails/19.jpg)
Vprašanja?