Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Sigurnost
  • Otvorena biblioteka - otvorena biblioteka obrazovnih informacija. Teorija informacija

Otvorena biblioteka - otvorena biblioteka obrazovnih informacija. Teorija informacija

Sada postoji mnogo algoritama za komprimiranje informacija. Većina njih je nadaleko poznata, ali postoje neki vrlo efikasni, ali ipak malo poznati algoritmi. Ovaj članak govori o metodi aritmetičko kodiranje, što je najbolja od entropije, ali ipak malo ljudi zna za to.
Prije nego što govorimo o aritmetičkom kodiranju, moramo reći nekoliko riječi o Huffman algoritmu. Ova metoda je efikasna kada je broj znakova proporcionalan 1/2 n (gdje je n prirodno pozitivan broj). Ova izjava postaje očigledna ako se prisjetimo da se Huffmanovi kodovi za svaki znak uvijek sastoje od cijelog broja bitova. Razmotrimo situaciju kada je učestalost pojavljivanja znaka 0,2, tada bi optimalni kod za kodiranje ovog znaka trebao imati dužinu –log 2 (0,2)=2,3 bita. To je jasno kod prefiksa Huffman ne može imati takvu dužinu, tj. ovo na kraju rezultira lošijom kompresijom podataka.
Aritmetičko kodiranje je dizajnirano da riješi ovaj problem. Osnovna ideja je da se kodovi ne dodijele pojedinačni likovi, ali njihove sekvence.
Prvo, pogledajmo ideju iza algoritma, a zatim pogledajmo mali praktični primjer.
Kao iu svim entropijskim algoritmima, imamo informacije o učestalosti upotrebe svakog znaka abecede. Ova informacija je početna tačka za metodu koja se razmatra. Sada da uvedemo koncept radnog segmenta. Polu-interval se naziva radni interval Koliko trocifrenih heksadecimalnih brojeva postoji za koje će istovremeno postojati

Predavanje 13 Tehnike i metode rada sa komprimiranim podacima Predavač St. nastavnik Kupo A.N. Karakteristična karakteristika većine "klasičnih" tipova podataka s kojima ljudi tradicionalno rade je izvjesna

Federalna državna obrazovna budžetska ustanova visokog stručnog obrazovanja Volga Državni univerzitet za telekomunikacije i informatiku Odsjek SARS Zadatak i metodologija

UDC 519.6 Značajke kodiranja teksta pomoću Huffmanovog algoritma Kizyanov Anton Olegovich Priamur State University po imenu Sholom Aleichem Student Kuzmina Bogdana Sergeevna Priamursky

LABORATORIJSKI RAD Metode za postavljanje i glavne karakteristike konvolucionih kodova Konvolucijski kodovi se široko koriste u različitim oblastima tehnologije za prenos i skladištenje informacija. Najvidljiviji

UDK 004.8 PRIMJENA GENETIČKOG ALGORITMA ZA UPRAVLJANJE DIZAJNOM ŠKOLSKOG RASPOREDA Gushchina OA Genetski algoritam (GA) adaptivni algoritam pretraživanja zasnovan na evolucijskim faktorima

Diskretna matematika 2. deo Jurij Andrejevič Kočetov http://www.math.nsc.ru/lbrt/k5/dm.html Predavanje 1 Algoritmi, sortiranja, AVL stabla 1 Algoritmi i njihova složenost Računari rade (do sada) samo ispravno

Hafmanova metoda je jednostavna, ali efikasna samo kada su verovatnoće pojavljivanja simbola jednake brojevima, gde je bilo koji pozitivan ceo broj. To je zato što Huffmanov kod svakom znaku abecede dodjeljuje kod s cijelim brojem bitova. U isto vrijeme, u teoriji informacija je poznato da, na primjer, ako je vjerovatnoća pojavljivanja simbola 0,4, idealno bi mu trebalo dati kod dužine bit. Jasno je da je prilikom konstruisanja Huffmanovih kodova nemoguće postaviti dužinu koda na 1,32 bita, već samo na 1 ili 2 bita, što će rezultirati lošijom kompresijom podataka. Aritmetičko kodiranje rješava ovaj problem dodjeljivanjem koda cijeloj, obično velikoj, datoteci koja se prenosi, umjesto kodiranja pojedinačnih znakova.

Ideju aritmetičkog kodiranja najbolje je vidjeti na jednostavnom primjeru. Pretpostavimo da je potrebno kodirati tri karaktera ulaznog toka, radi određenosti, ovo je niz SWISS_MISS sa datim frekvencijama znakova: S - 0,5, W - 0,1, I - 0,2, M - 0,1 i _ - 0, jedan. U aritmetičkom koderu, svaki znak je predstavljen intervalom u rasponu brojeva), i interval za /-ti kodirani simbol toka kao ; b[c]), uključujući 0,341. Nabrajanjem svih mogućih simbola prema gornjoj tabeli nalazimo da je samo interval - (fti-j - li-i); zdravo= li!+ b ■ (zdravo! - li.i); ako ((lt<= 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 se može ubrzati. Imajte na umu da pošto b[c^ (\=a; II divider=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 resetiranje

dok (ne DataFile.EOFO) (

c = DataFile.ReadSymbol(); // Čitanje karaktera
j= IndexForSymbol(c); i++; // Pronađite njegov indeks
li= li.j + b*(h i. 1 - li-x+l)/razdjelnik;
zdravo= li!+ b;
Prvi_qtr = (h 0 +l)/4; // = 16384

Pola = Prvi_qtr*2; // = 32768

Third_qtr = First_qtr*3; // = 49152

value=CompressedFile.Readl6Bit();

for(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 = 1s+ blj-l]*(bi.!- li- u + l) / razdjelnik;

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

for(;;) ( // Opcije obrade

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

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

2i-=Pola; hi=Half; vrijednost-= Polovina; )

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

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

Vježba. Navedite 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čajni gubici u tačnosti (djelići procenta za dovoljno veliku datoteku) i, shodno tome, smanjenje stepena kompresije u odnosu na idealni algoritam nastaju tokom operacije dijeljenja, kada se relativne frekvencije zaokružuju na cijeli broj, kada je posljednji bitovi se upisuju u datoteku. Algoritam se može ubrzati predstavljanjem relativnih frekvencija tako da je djelitelj potencija dva (tj. zamjenom dijeljenja operacijom pomaka po bitu).

Da biste procijenili stepen kompresije aritmetičkim algoritmom određenog niza, morate pronaći minimalni broj N, tako da bi dužina radnog intervala za vrijeme kompresije posljednjeg karaktera niza bila manja od 1/2^.. Ovaj kriterij znači da unutar našeg intervala sigurno postoji barem jedan broj u čijoj binarnoj predstavi nakon N-ro predznak će biti samo 0. Dužina intervala je lako čitljiva, pošto je jednaka proizvodu vjerovatnoća svih znakova.

Razmotrimo raniji primjer niza od dva znaka l i Kommersant sa vjerovatnoćama 253/256 i 3/256. Dužina posljednjeg radnog intervala za niz od 256 znakova a i b sa naznačenim verovatnoćama jednaka. Lako je izračunati da je traženi N=24 (1/2 24 = 5,96-10" 8), pošto 23 daje preveliki interval (2 puta širi), a 25 nije minimalno broj koji ispunjava kriterijume. Gore je pokazano da Hafmanov algoritam kodira ovaj lanac u 256 bita. To jest, 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 omjer kompresije za niz "BOX.BOX".

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

Karakteristike aritmetičkog algoritma:

Najbolji i najgori omjer kompresije: najbolji > 8 (moguće manje bitova po karakteru), najgori - 1.

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

karakteristike: kao i Huffmanovo 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 poprimiti 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 dodijelite raspon vrijednosti u intervalu , Prev_freq[c], 10) ;

Rezultat

Normalizacija

Normalizacija

Normalizacija

Kao što je već napomenuto, najčešće nema prijenosa tokom normalizacije. Na osnovu toga, Dmitrij Subbotin 1 predložio je 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, porast u brzini također nije bio previše primjetan. Glavna prednost ovog pristupa je jednostavnost i kompaktnost koda. Evo kako izgleda funkcija normalizacije za 32-bitnu aritmetiku:

♦definirajte KODOVE 24

♦definiraj VRH (l«KODEBITI)

♦definirajte DNO (VRH»8)

♦definiraj BIGBYTE(0xFF"(CODEBITS-8))

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

if(nisko & BIGBYTE == BIGBYTE &&

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

Može se vidjeti 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 0xFF, a dodavanje raspona low-u rezultira prijenosom. Ovako izgleda optimizirana procedura normalizacije:

void encode_normalize(void) ( while((niski " niski + opseg) } }

void decode_normalize(void) ( while((niski i niski+opseg) }

Vježba. Primijenite span kodiranje bez premotavanja na niz "krava krava".

2.3 Aritmetičko kodiranje

Algoritmi Shannon-Fenot i Huffman u najboljem slučaju ne mogu kodirati svaki znak poruke sa manje od 1 bita informacije. Pretpostavimo da u poruci koja se sastoji od 0 i 1 ima 10 puta češće. Entropija takve poruke HX0,469 (bit/Sim). U takvom slučaju poželjno je imati šemu kodiranja omogućavajući kodiranje znakova poruke manje od 1 bita informacije. Jedan od najboljih algoritama za takvo kodiranje informacija je aritmetičko kodiranje.

Prema početnoj raspodjeli vjerovatnoće d.r.v. izgrađena je tabela koja se sastoji od segmenata koji se sijeku na graničnim tačkama za svaku od vrijednosti d.r.v. Unija ovih segmenata treba da formira interval , a njihove dužine su proporcionalne vjerovatnoći kodiranih vrijednosti.

Algoritam kodiranja sastoji se od konstruisanja segmenta koji na jedinstven način određuje određeni niz znakova poruke. Kako ulazni znakovi pristižu, segment poruke se sužava. Segmenti su konstruisani na sledeći način. Ako postoji segment poruke dužinen -1 , zatim da se konstruiše segment poruke dužinen znakova, prethodni interval je podijeljen na onoliko dijelova koliko ima vrijednosti uključenih u izvornu abecedu. Početak i kraj svakog novog intervala poruke određuje se dodavanjem na početak prethodnog intervala proizvoda njegove širine i vrijednosti granica segmenta koji odgovaraju trenutnom novom znaku (prema originalnoj tablici vjerovatnoća simbola i njihovim dodijeljenim intervalima). Zatim se iz primljenih segmenata bira jedan koji odgovara određenom nizu dužine simbola poruken .

Za izgrađeni segment poruke postoji broj koji pripada ovom segmentu, obično je to cijeli broj podijeljen najmanjom mogućom potencijom od 2. Ovaj pravi broj će biti kod za dotični niz. Svi mogući kodovi su brojevi striktno veći od 0 i manji od 1, tako da se početna 0 i decimalna točka zanemaruju.

Kako se izvorni tekst kodira, njegov interval se sužava, a shodno tome se povećava i broj bitova koji se koriste za njegovo predstavljanje. Sljedeći karakteri ulaznog teksta smanjuju širinu segmenta u zavisnosti od njihove vjerovatnoće. Verovatniji znakovi sužavaju interval manje od manje verovatnih i stoga dodaju manje bitova rezultatu.

Fundamentalna razlika aritmetičko kodiranje od metoda kompresije Shannon-Fenot i Huffman u svom kontinuitetu, tj. u nedostatku potrebe za blokiranjem poruke. Efikasnost aritmetičkog kodiranja raste sa dužinom komprimovane poruke, ali zahteva velike računarske resurse.

Objasnimo ideju aritmetičkog kodiranja koristeći konkretne primjere.

Primjer 1 Kodirajte tekstualni niz « MATEMATIKA » prema algoritmu aritmetičkog kodiranja.

Kodirana abeceda poruke sadrži sljedeće znakove: ( M , ALI , T , E , I , To }.

Određujemo učestalost svakog od simbola u poruci i svakom od njih dodjeljujemo segment čija je dužina proporcionalna vjerovatnoći odgovarajućeg simbola ( tab. 2.7).

Simboli u tabeli simbola i intervala mogu se poredati bilo kojim redom: kako se pojavljuju u tekstu, abecednim redom ili uzlaznim redom verovatnoće - nije važno. Rezultat kodiranja može biti drugačiji, ali će učinak biti isti.

Tabela 2.7

Simbol

Vjerovatnoća

Interval

M

0,2

11

(8/9; 1 ]

111

(26/27; 1 ] " 31/32 ®

110

(8/9; 26/27 ] " 15/16 ®

10

(2/3; 8/9 ]

101

(22/27; 8/9 ] " 7/8 ®

100

(2/3; 22/27 ] " 3/4 ®

0

(0 ; 2/3 ]

01

(4/9; 2/3 ]

101

(16/27; 2/3 ] " 5/8 ®

100

(4/9; 16/27 ] " 1/2 ®

00

(0; 4/9 ]

001

(8/27; 4/9 ] " 3/8 ®

000

(0; 8/27 ] " 1/4 ®

Prosječna dužina koda po jedinici poruke

Evo procedure aritmetičkog kodiranja za niz proizvoljne dužine:

Dok još ima ulaznih simbola

dobiti simbol za unos

code_range = visok - nizak.

visoka = niska + raspon_koda*visoki_raspon (simbol)

nisko = nisko + code_range*low_range(simbol)

Dekoder , kao i koder, poznata je tabela raspodjele segmenata dodijeljenih simbolima izvorne abecede. Aritmetički kod poruke se dekodira prema sljedećem algoritmu:

Korak 1 Tabela segmenata abecednih znakova određuje interval koji sadrži trenutni kod poruke - a ovaj interval iz iste tabele jedinstveno određuje karakter originalne poruke. Ako je to marker za kraj poruke, onda kraj, u suprotnom idite na korak 2.

Korak 2 Donja granica intervala koji ga sadrži oduzima se od trenutnog koda. Dobivena razlika je podijeljena s dužinom ovog intervala. Rezultirajuća vrijednost se smatra novim trenutnim kodom. Idite na korak 1.

Razmotrimo primjer dekodiranja poruke komprimirane pomoću algoritma aritmetičkog kodiranja.

Primjer 3 Dužina originalne poruke je 10 karaktera. Kod binarne aritmetičke poruke 000101000001100001011111 2 = 1316259 10 .

Pravi broj koji pripada intervalu koji jedinstveno identifikuje kodiranu poruku, . Ovaj broj će biti trenutni kod poruke.

Prema originalnoj tabeli d.s.v. i njima dodijeljenim intervalima ( sto 2.7 ) određuje se segment kojem ovaj broj pripada - }

Top Related Articles