Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Greške
  • Primjer aritmetičkog kodiranja. Pregled algoritama kompresije bez gubitaka

Primjer aritmetičkog kodiranja. Pregled algoritama kompresije bez gubitaka

Za Coderz - Aritmetičko kodiranje.

Aritmetičko kodiranje www.codenet.ru, nepoznat autor. Objavljeno u skraćenicama. Ideja aritmetičkog kodiranja.Kod aritmetičkog kodiranja, tekst je predstavljen realnim brojevima u intervalu od 0 do 1. Po mjeri kodiranja teksta-Interval koji ga prikazuje se smanjuje, a broj bitova zanjegova percepcija se povećava. Sljedeći znakovi u tekstu se skraćujuvrijednost intervala, na osnovu vrijednosti njihovih vjerovatnoća, određena jemx model. Vjerovatniji likovi to rade u manjoj mjeri.što je manje vjerovatno, i stoga dodajte manje bitova rezultat. Prije početka rada, odgovarajući tekstualni interval je do cum_freq. Silazno i ​​cum_freq [i] raste tako da cum_freq = 1. (Razlog za ovaj "obrnuti" sporazum je je to cum_freq će tada sadržavati faktor normalizacije, koji je pogodan za pohranjivanje na početku niza). Trenutni interval rada je podešen i biće jednaki na samom početku // ALGORITAM ARITHMETIČKOG DEKODIRANJA// Vrijednost je ulazni broj// Pozivanje procedure decode_symbol () dok se ne vrati// "završni" znak decode_symbol (cum_freq) tražiti karakter takav dacum_freq // nisko = nisko + opseg * cum_freqpovratni simbol Opisani algoritam kodiranja ne prenosi ništa dok se kompletno kodiranje cijelog teksta ne završi, a dekoder ne pokreće proces dok ne primi potpuno komprimirani tekst. U većini slučajeva potreban je postupni način izvršavanja. Potrebno za predstavljanje intervala visoko-nisko + 1 , Drugim riječima:(niska vrijednost + 1) * cum_freq-1 cum_freq (1) domet , raspon - 1 gdje raspon = visoko - nisko + 1, 0. raspon (Posljednja nejednakost izraza(1) dolazi iz činjenice da cum_freqmora biti cela). Onda želimo da pokažemošta je nisko" gdje nisko "i visoko" postoje ažurirane vrijednosti za nisko i visoko, kako je definisano u nastavku. raspon * cum_freq (a) nisko "* nisko + [─────────────────────] cum_freq cum_freq opseg 1 iz izraza (1) imamo: , cum_freq je stoga nizak " jer i vrijednost i niska "i cum_freq> 0. raspon * cum_freq (a) visoko "* nisko + [──────────────────────] - 1> = cum_freq opseg (niska vrijednost + 1) * cum_freq-1> = nisko + ─────────── [────────────────────────── + 1 - e] - 1cum_freq raspon od izraza(1) imamo: raspon 1 raspon-1 > = vrijednost + ─────────── [- ───── + 1 - ───────] = vrijednost... opseg opsega cum_freq Negativno prelijevanje. Kao što je prikazano u pseudokodu, aritmetičko kodiranje radi skaliranjem akumuliranih vjerovatnoća koje daje model u intervalu za svaki preneseni znak. Pretpostavimo to niske i visoke su toliko blizu jedan drugom da operacija skaliranja transformiše različite simbole primljene iz modela u jedan cijeli broj uključen u. U ovom slučaju dalje kodiranje se ne može nastaviti. Shodno tome, koder mora osigurati da intervalje oduvek bila dovoljno široka. Najlakši način da to uradite je da obezbedite širinu intervala od najmanje Max_frequency - maksimalna vrijednost zbira svih akumuliranih frekvencija. Kako ovo stanje učiniti manje strogim? Operacija pomaka bita koja je gore objašnjena to osigurava niske i visoke može postati opasno blizu samo kada Half.Recimo da se tako zbližeFirst_qtr (*) Tada će sljedeća dva izlazna bita imati recipročne vrijednosti: 01 ili 10. Na primjer, ako je sljedeći bit nula (tj. visoka pada ispod polovine, i postaje radni interval), a sljedeći nakon njega postaje jedinica, jer interval mora biti iznad sredine radnog intervala. Suprotno tome, ako se ispostavi da je sljedeći bit 1, onda će to biti praćeno 0. Dakle, sada se interval može sigurno proširiti udesno, ako samo zapamtimo da bilo koji bit sljedeći, nakon što mora također biti proslijeđen izlaznom toku njegova povratna vrijednost. Program se transformiše u čitavom intervalu, pamćenje u bits_to_follow vrijednost bita, nakon čega je potrebno poslati povrat na njega. Sav izlaz se vrši kroz bit_plus_follow () proceduru,a ne direktno kroz izlazni_bit (). Što učiniti ako nakon ove operacije omjer(*) ostaje pošteno? V opšti slučaj potrebno je prvo izbrojati broj ekstenzija, a zatim, nakon sljedećeg bita, poslati u izlazni tok pronađeni broj obrnutih bitova. Slijedeći ove smjernice, koder će to osigurati nakonsmjena će biti ili nisko , (1a) ili nisko . (1b) To znači da dok se cjelobrojni interval pokriven akumuliranim frekvencijama nalazi u svojoj četvrtini, predstavljenoj ucode_value, neće biti problema s negativnim prelivanjem. Ovo je prikladno primjenjuje uvjet: Top_value + 1 Max_frequency , 4 koji je zadovoljan u programu, jer. Max_frequency = 2 ^ 14-1 i Top_value = 2 ^ 16-1. To je nemoguće bez povećanja broja dodijeljenih bitova kod_vrijednosti, koristiti više za predstavljanje akumuliranih brojača frekvencija 14 bits. Problem negativnog prelivanja smo razmatrali samo u odnosu na enkoder, jer prilikom dekodiranja svakog karaktera proces prati operaciju kodiranja, a negativno prelivanje neće nastati ako se isto skaliranje izvrši pod istim uslovima.Overflow. Hajde sada da razmotrimo mogućnost prelivanja tokom celobrojnog množenja. Ne dolazi do prekoračenja ako je opseg proizvodnje * Max_frequencyuklapa se u cijelu riječ, jer akumuliranifrekvencije ne mogu prelaziti Max_frequency. Domet je od najveće važnosti u Najviša_vrijednost + 1, stoga je maksimalni mogući proizvod u programu 2 ^ 16 * (2 ^ 14-1), što je manje od 2 ^ 30. Dugi tip se koristi za definiranje code_value i raspona, da obezbedi 32-bitnu preciznost za aritmetička izračunavanja.Fiksni modeli. Najjednostavniji model je onaj u kojem su brzine karaktera konstantne. Akumuliranim brzinama bajtova koji se nisu pojavili u uzorku daju se vrijednosti jednake 1 (onda će model raditi i za binarne datoteke, gdje je sve 256 bajtova). Strogi model je onaj kod kojeg se frekvencije karaktera teksta tačno poklapaju sa receptima modela.Međutim, da bi isti bio strog, znakovi koji se ne pojavljuju u ovom fragmentu moraju imati brojače jednake nuli, a ne 1 (istovremeno žrtvujući mogućnost kodiranja tekstova koji sadrže ove znakove). Uz to, frekvencije ne bi trebalo skalirati na zadatu akumuliranu frekvenciju, kao što je to bilo u programu. Strogi model se može izračunati i proslijediti prije slanja teksta. Cleary and Whitten pokazao da kada opšti uslovi to neće dati sveukupno boljenjegovu kompresiju u odnosu na adaptivno kodiranje opisano u nastavku.Responzivni model. Mijenja frekvencije znakova koji se već nalaze u tekstu. U početku, svi brojači mogu biti jednaki, što odražava odsustvo početnih podataka, ali kako se svaki ulazni karakter ispituje, oni se mijenjaju, približavajući se posmatranim frekvencijama. I koder i dekoder koriste isto početne vrijednosti(na primjer, jednaki brojači) i isti algoritam ažuriranja, koji će omogućiti da njihovi modeli uvijek ostanu na istom nivou. Koder prima sljedeći znak, kodira ga i modificira model. Dekoder određuje sljedeći karakter na osnovu svog trenutnog modela, a zatim ga ažurira. Procedura update_model (simbol) se poziva iz encode_symbol () i decode_symbol () nakon obrade svakog znaka. Ažuriranje modela je prilično skupo zbog potrebe održavanja akumuliranih iznosa. U programu se korišćeni frekventni brojači optimalno postavljaju u niz redosledom smanjenja vrednosti, što je efektivan pogled samoorganizirajuće linearno pretraživanje. Procedura update_model () prvo provjerava novi model da li premašuje granice vrijednosti akumulirane frekvencije, a ako je to slučaj, onda smanjuje sve frekvencije dijeljenjem sa 2, pritom vodeći računa da se šalteri ne pretvore u 0, i ponovo izračunava akumulirane vrijednosti. Zatim, ako je potrebno, update_model ()mijenja redoslijed znakova kako bi se promijenila veličinaotkucajte struju u svojoj ispravnoj kategoriji u odnosu na redosled frekvencija, naizmjenično sa tabelama konverzije kako bi se odrazile promjene. Kao rezultat, procedura povećava vrijednost odgovarajućeg brojača frekvencije i naređuje odgovarajuće akumulirane frekvencije.Efikasnost kompresije. Kod kodiranja teksta aritmetičkom metodom, broj bitova u kodiranom nizu jednak je entropiji ovog teksta u odnosu na model koji se koristi za kodiranje. Tri faktora uzrokuju pogoršanje ove karakteristike: * trošak kompletiranja teksta; * korištenje aritmetike ne-beskonačne preciznosti; * skaliranje brojača tako da njihov zbir ne prelazi Max_frequency.Nijedan od njih se nije pokazao značajnim. U redoslijedu isticanja rezultata aritmetičkog kodiranja, model će se smatrati strogim (u gore definiranom smislu). Aritmetičko kodiranje treba poslati dodatne bitove na kraj svakog teksta, čime se ulažu dodatni napori da se tekst završi.Da bi se eliminisala dvosmislenost sa zadnjim znakom, procedura gotovo_kodiranje () šalje dva bita. U slučaju kada prije kodiranja tok bitova mora biti blokiran u 8-bitne znakove, bit će potrebno zatvoriti do kraja bloka. Takva kombinacija može dodatno zahtijevati 9 bits. Troškovi upotrebe aritmetike konačne preciznosti manifestuju se u smanjenju reziduala prilikom dijeljenja, što se može vidjeti u poređenju sa teorijskom entropijom, koja izvodi frekvencije iz brojača, koji su također skalabilni tokom kodiranja. Ovdje su troškovi beznačajni - po redu 10^-4 bitovi / karakter. Dodatni troškovi za skaliranje brojača su dijelom veći, ali i dalje vrlo mali. Za kratke tekstove (manje od 2 ^ 14bajtova) nisu. Ali čak i sa tekstovima 10 ^ 5 - 10 ^ 6 bajtova nac- razumni troškovi, izračunati eksperimentalno, manji su od 0,25%iz kodiranog niza.Adaptivan model u programu, sa pretnjom prekoračenja ukupnog iznosa akumuliranih frekvencija, vrednost Max_frequency, smanjuje sve brojače. Zbog toga je teže odmjeriti nedavne događaje nego ranije. Dakle, metrika ima tendenciju da prati promjene u ulaznoj sekvenci, što može biti vrlo korisno. (Nailazili smo na slučajeve ograničavanja brojača na 6-7 bitovi su dali bolje rezultate od poboljšanja tačnosti aritmetike.) Naravno, ovo zavisi od izvora na koji se model primenjuje.Ograničena implementacija. Ograničenja dužine riječi uzrokovana mogućnošću prelivanja mogu se generalizirati pretpostavkom da su brojači frekvencija f sa bitovima i code_values ​​sa c bits. Program će ispravno raditi kada f i f + c gdje je str postoji preciznost aritmetike. U većini implementacija na Si p = 31, ako koristite cijele brojeve poput dugo, i p = 32 ako je dug bez predznaka. U našem programu f = 14 i c = 16. Uz odgovarajuće izmjene u najavama na unsigned long može biti f = 15 i c = 17. Na asemblerskom jeziku c = 16 je prirodan izbor, jer neke ubrzavaprve operacije poređenja i manipulacije bitovima. Ako ograničite str 16 bita onda najbolje od moguće vrijednosti c i f postoje respektivno 9 i 7, koji vam ne dozvoljava da kodirate slobodna abeceda od 256 znakova, jer će svaki od njih imati vrijednost brojača od najmanje jednog. Sa manjim alfabetom (na primjer, iz 26 slova ili 4-bitne vrijednosti) još uvijek možete zaobići.Zatvaranje. Na kraju procesa kodiranja, morate poslati jedinstveni završni znak[potrebno je ako dekoder ne zna dužinu teksta],a zatim pošaljite dovoljno bitovakako bi se osiguralo da kodirani niz uđe u konačni radni interval. Jer procedura gotovo_kodiranje () mogu biti sigurni u to niske i visoke ograničen bilo izrazom(1a) ili (1b), ona treba da položi samo 01 ili 10 shodno tome, otkloniti preostalu nesigurnost. Pogodno je to učiniti koristeći prethodno razmatrani postupak bit_plus_follow (). Input_bit () procedura zapravo će pročitati malo više bitova koje output_bit () izlaze,jer treba da stalno ispunjava dnokraj bafera. Nije bitno koje je značenje ovih bitova, pošto EOFjedinstveno definiran posljednjim prenesenim bitovima.Sve tačne veze na autorski C program Uništio sam, ali u isto vrijeme ostavio podatke o odnosima imena promjenai procedure, što je dovoljno za vraćanje logikeprograme. Program je jako loše osmišljen i samim tim teškodobro će vam doći (na C možete lako napisati svoje), pa smo staviliimplementirana njegova asemblerska verzija Vitamin 'ohm i ubrzan ja bez promjene algoritma. Za postizanje veće brzinebrzina raspakivanja (brzina pakovanja je manje bitna) treba je promijenitinit u dijelu ažuriranja modela i traženja. Algoritam u gotovo svakomslučaj će morati da se promeni, pošto je sve podržano 256 literala a pohranjuje se samo jedan model u isto vrijeme - to nije dovoljnoza pisanje dobrog pakera. Cm. ARIF16m.H u aplikaciji.

Klasična verzija algoritma

Huffmanova kompresija postepeno se zamjenjuje aritmetičkom kompresijom. Ulogu u tome odigrao je istek patentnih perioda koji je ograničavao upotrebu aritmetičke kompresije. Osim toga, Huffmanov algoritam aproksimira relativne frekvencije pojavljivanja simbola u toku frekvencijama koje su višestruke stepena dvojke (na primjer, za simbole a b c d sa vjerovatnoćama 1/2, 1/4, 1/8, 1/8, koristiće se kodovi O, 10, 110, 111), a aritmetička kompresija daje najbolji stepen aproksimacije frekvencije. Po Šenonovoj teoremi najbolja kompresija u binarnoj aritmetici, dobijamo ako kodiramo znak sa relativnom frekvencijom f sa koristeći -log 2 (f) bit.

0.3 0,4 0.5 0.6 0.7

Relativna frekvencija simbola

"^ ~" Optimalna kompresija
---- Metoda Huffman

Rice. 1.1. Uporedni dijagram optimalnog kodiranja i Huffmanovog kodiranja

Gornji grafikon uspoređuje optimalno kodiranje i Huffmanovo kodiranje. Jasno se vidi da u situaciji kada relativne frekvencije nisu stepena dvojke, kompresija postaje manje efikasna (trošimo više bitova nego što je potrebno). Na primjer, ako imamo dva znaka a i B sa verovatnoćama 253/256 i 3/256, onda bi idealno trebalo da potrošimo na lanac od 256 bajtova -log 2 (253/256) -253-bg 2 (3/256) -3 = 23.546, tj. 24 bita ... Kod kodiranja prema Huffmanu ćemo kodirati a i B kao 0 i 1 i morat ćemo potrošiti 1 -253 + 1 -3 = 256 bita, odnosno 10 puta više. Razmotrite algoritam koji daje rezultat blizu optimalnog.

Aritmetička kompresija je prilično zgodna tehnika koja se zasniva na vrlo jednostavna ideja... Kodirani tekst predstavljamo kao razlomak, a razlomak konstruiramo na način da naš tekst bude predstavljen što je moguće kompaktnije. Na primjer, razmotrite konstrukciju takvog razlomka na intervalu; B [c]), i interval za i-ti kodirani simbol toka kao; B [c]), uključujući 0,341. Nabrajanje svih mogući simboli prema gornjoj tabeli nalazimo da je samo interval (fti-j - li-i); zdravo= li.!+ b ■ (zdravo! - li.i); ako ((l t<= value) && (value < zdravo)) break; ); DataFile.WriteSymbol (c ^);

gdje je vrijednost broj (razlomak) pročitan iz toka, i sa - raspakovani karakteri upisani u izlazni tok. Kada koristite abecedu od 256 znakova Cj unutrašnjoj petlji je potrebno mnogo vremena da se završi, ali možete je ubrzati. Imajte na umu da pošto B [c ^ (\ = a; II delitel = 10

Prvi_qtr - (h 0 + l) / 4; // - 16384

Pola = Prvi_qtr * 2; // - 32768

Third_qtr - First_qtr * 3; // = 49152

bits_to_follow = 0; // Koliko bitova za brisanje

dok (ne DataFile.EOFO) (

c = DataFile.ReadSymbol (); // Pročitajte simbol
j= IndexForSymbol (s); i ++; // Pronađite njegov indeks
li= li.j + b * (h i. 1 - li-x+ l) / delitel;
zdravo= li.!+ b;
Prvi_qtr = (h 0 + l) / 4; // = 16384

Pola = Prvi_qtr * 2; // = 32768

Third_qtr = First_qtr * 3; // = 49152

vrijednost = CompressedFile.Readl6Bit ();

za (i = l; i< CompressedFile.DataLengthO; i++){

freq = ((vrijednost-2 i. 1 + l) * delitel-l) / (h i. I - 1 ±. X+ 1) ;

za (j = l; b<=freq; j++); // Поиск символа

li = 1y+ blj-l] * (bi.!- li- u + l) / delitel;

zdravo= Ja sam+ b * (h i. 1 - li.!+ l) / delitel - 1;

za (;;) (// Opcije procesa

ako (zdravo< Half) // переполнения

; // Ništa drugo ifdi> = Pola) (

2i- = polovina; hi- = polovina; vrijednost- = polovina; )

inače if (di> = Prvi_qtr) && (bok< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

vrijednost + = vrijednost + CompressedFile.ReadBit (); } DataFile.WriteSymbol (c););

Vježba. Predložite primjere nizova komprimiranih algoritmom s maksimalnim i minimalnim koeficijentima.

Kao što vidite, borimo se sa netačnostima aritmetike tako što izvodimo odvojene operacije na / i A, sinhrono u kompresoru i dekompresoru.

Beznačajan gubitak točnosti (djelići postotka za dovoljno veliku datoteku) i, shodno tome, smanjenje omjera kompresije u odnosu na savršen algoritam nastaju tokom operacije dijeljenja, kada se relativne frekvencije zaokružuju na najbliži cijeli broj, kada se posljednji bitovi upisuju u datoteku. Algoritam se može ubrzati predstavljanjem relativnih frekvencija tako da je djelitelj stepen dva (tj. zamjenom dijeljenja operacijom pomaka po bitu).

Da biste procijenili omjer kompresije pomoću aritmetičkog algoritma određenog niza, morate pronaći minimalni broj N, tako da bi dužina radnog intervala pri kompresiji posljednjeg karaktera lanca bila manja od 1/2 ^ .. Ovaj kriterij znači da unutar našeg intervala sigurno postoji barem jedan broj u binarno predstavljanje koji posle N-ro znakova će biti samo 0. Dužina intervala je lako čitljiva, jer je jednaka proizvodu vjerovatnoća svih simbola.

Razmotrimo raniji primjer niza od dva znaka l and B sa vjerovatnoćama 253/256 i 3/256. Dužina posljednjeg radnog intervala za niz od 256 znakova a i B sa jednakim naznačenim verovatnoćama. Lako je izračunati da je traženi N = 24 (1/2 24 = 5,96-10 "8), pošto 23 takođe daje veliki interval(2 puta širi) a 25 nije minimalno broj koji ispunjava kriterijum. Gore je pokazano da Huffmanov algoritam kodira ovaj niz u 256 bita. Odnosno, za razmatrani primjer aritmetički algoritam daje desetostruku prednost u odnosu na Huffman algoritam i zahtijeva manje od 0,1 bita po simbolu.

Vježba. Izračunajte procjenu omjera kompresije za liniju "COV.KOROBA".

Treba reći nekoliko riječi o algoritmu adaptivne aritmetičke kompresije. Njegova ideja je da se ponovo izgradi tabela verovatnoće b [f] prilikom pakovanja i raspakivanja odmah po prijemu sledećeg karaktera. Takav algoritam ne zahtijeva pohranjivanje vrijednosti vjerojatnosti znakova u izlaznoj datoteci i, u pravilu, daje visok omjer kompresije. Tako, na primjer, datoteku poput 1000 £ 1000 sa 1000 b / 1000 (gdje stepen znači broj ponavljanja datog znaka) adaptivni algoritam će moći efikasnije komprimirati nego trošenje 2 bita po karakteru. Gornji algoritam se jednostavno pretvara u prilagodljivi. Ranije smo tabelu opsega sačuvali u fajlu, a sada računamo direktno u toku rada kompresora i dekompresora, preračunavamo relativne frekvencije, prilagođavajući tabelu opsega u skladu sa njima. Važno je da se promjene u tabeli odvijaju u kompresoru i dekompresoru sinhrono, tj. kodiranje lanci dužine 100 tabela raspona bi trebala biti potpuno ista kao i poslije dekodiranje lanci dužine 100. Ovaj uslov je lako ispuniti ako promijenite tabelu poslije kodiranje i dekodiranje sljedećeg znaka. Za više detalja o adaptivnim algoritmima, pogledajte pogl. 4.

Karakteristike aritmetičkog algoritma:

Najbolji i najgori omjer kompresije: najbolji> 8 (moguće je kodiranje manje od bita po simbolu), najgori - 1.

Prednosti algoritma: Pruža bolji omjer kompresije od Algo-I Huffmanovog ritma (na tipičnim podacima za 1-10%).

karakteristike: kao i Huffman kodiranje, ne povećava veličinu originalnih podataka u najgorem slučaju.

Intervalno kodiranje

Za razliku od klasičnog algoritma, intervalno kodiranje pretpostavlja da imamo posla s diskretnim cijelim brojevima koji mogu uzeti ograničen broj vrijednosti. Kao što je već napomenuto, početni interval u cjelobrojnoj aritmetici zapisuje se kao [OD) ili gdje N- broj mogućih vrijednosti za varijablu koja se koristi za pohranjivanje granica intervala.

Da bismo najefikasnije komprimirali podatke, moramo kodirati svaki znak s preko -log 2 (J) bita, gdje f,- frekvencija simbola s. Naravno, u praksi je takva tačnost nedostižna, ali možemo za svaki lik s dodijeliti raspon vrijednosti u intervalu , Prev_freq [c], 10);

Rezultat

Normalizacija

Normalizacija

Normalizacija

Kao što je već napomenuto, najčešće ne dolazi do prijenosa tokom normalizacije. Polazeći od toga, Dmitrij Subbotin 1 je predložio da se u potpunosti odustane od transfera. Ispostavilo se da je gubitak u kompresiji prilično beznačajan, reda veličine nekoliko bajtova. Međutim, povećanje brzine također nije bilo previše primjetno. Glavna prednost ovog pristupa je jednostavnost i kompaktnost koda. Ovako izgleda funkcija normalizacije za 32-bitnu aritmetiku:

♦ definirati CODEBITS 24

♦ definirati TOP (l "CODEBITS)

♦ definirajte BOTTOM (TOP "8)

♦ definirati BIGBYTE (0xFF “(CODEBITS-8))

void encode_normalize (void) (dok (opseg< BOTTOM) {

if (nisko & BIGBYTE == BIGBYTE &&

raspon + (nisko & BOTTOM-1)> = BOTTOM) raspon = BOTTOM - (nisko & BOTTOM-1); output_byte (niski "24); domet<<=8; low«=8; })

Može se primijetiti da nam pravovremeno prisilno smanjenje vrijednosti veličine intervala omogućava izbjegavanje prijenosa. Dešava se

kada je drugi najznačajniji niski bajt postavljen na OxFF, i kada se vrijednost veličine raspona doda na low, dolazi do prijenosa. Ovo je optimizirana procedura normalizacije:

void encode_normalize (void) (dok ((nisko "nisko + raspon) } }

void decode_normalize (void) (dok ((nisko i nisko + raspon) }

Vježba. Primijenite razmaknuto kodiranje bez prijeloma reda "krava. krava".

Sada postoji mnogo algoritama za komprimiranje informacija. Većina njih je nadaleko poznata, ali postoje i neki vrlo efikasni, ali, ipak, malo poznati algoritmi. Ovaj članak govori o metodi aritmetičkog kodiranja, koja je najbolja od entropijskih metoda, ali ipak vrlo malo ljudi zna za nju.
Prije nego što pričamo o aritmetičkom kodiranju, moram reći nekoliko riječi o Huffman algoritmu. Ova metoda je efikasna kada su brzine simbola proporcionalne 1/2 n (gdje je n pozitivan cijeli broj). Ova izjava postaje očigledna kada se setite da se Hafmanovi kodovi za svaki znak uvek sastoje od celog broja bitova. Razmotrimo situaciju kada je frekvencija pojavljivanja simbola 0,2, tada bi optimalni kod za kodiranje ovog simbola trebao imati dužinu –log 2 (0,2) = 2,3 bita. Jasno je da kod Huffmanovog prefiksa ne može imati ovu dužinu, tj. ovo na kraju dovodi do loše kompresije podataka.
Aritmetičko kodiranje je dizajnirano da riješi ovaj problem. Glavna ideja je dodijeliti kodove ne pojedinačnim znakovima, već njihovim sekvencama.
Prvo ćemo pogledati ideju iza algoritma, a zatim ćemo pogledati mali praktični primjer.
Kao iu svim entropijskim algoritmima, imamo informacije o učestalosti upotrebe svakog znaka abecede. Ove informacije su izvor za razmatranu metodu. Sada ćemo predstaviti koncept segmenta prirubnice. Radnik se zove poluinterval)

Top srodni članci