Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Erori
  • Exemplu de codare aritmetică. O prezentare generală a algoritmilor de compresie fără pierderi

Exemplu de codare aritmetică. O prezentare generală a algoritmilor de compresie fără pierderi

Pentru Coderz - Codare aritmetică.

Codare aritmetică www.codenet.ru, autor necunoscut. Publicat în abrevieri. Ideea de codificare aritmetică.Cu codificarea aritmetică, textul este reprezentat prin numere reale în intervalul de la 0 la 1. Prin măsura codificării textuluiIntervalul de afișare scade și numărul de biți pentrupercepția lui este în creștere. Următoarele caractere din text se scurteazăvaloarea intervalului, pe baza valorilor probabilităților lor, este determinată demodelul mx. Caracterele mai probabile fac acest lucru într-o măsură mai mică.cu atât mai puțin probabil și, prin urmare, adăugați mai puțini biți la rezultatul. Înainte de a începe lucrul, intervalul de text corespunzător este de până la cum_freq. Descendent i cum_freq [i] crește astfel încât cum_freq = 1. (Motivul acestui acord „invers” este este cum_freq va conține apoi un factor de normalizare, care este convenabil de stocat la începutul matricei). Este setat intervalul de lucru curent şi va fi egal chiar la început // ALGORITM DE DECODIFICARE ARITMETICĂ// Valoarea este numărul de intrare// Apelarea procedurii decode_symbol () până când revine// caracterul „final”. simbol_decodare (cum_freq) caută un personaj astfel încâtcum_freq // scăzut = scăzut + interval * cum_freqsimbol return Algoritmul de codificare descris nu transmite nimic până când codificarea completă a întregului text nu este completă, iar decodorul nu începe procesul până când nu primește textul comprimat complet. În cele mai multe cazuri, este necesar un mod de execuție treptată. Necesar pentru a reprezenta intervalul mare-scăzut + 1 , Cu alte cuvinte:(valoare-scăzută + 1) * cum_freq-1 cum_freq (1) interval , interval - 1 unde interval = ridicat - scăzut + 1, 0. interval (Ultima inegalitate de expresie(1) provine din faptul că cum_freqtrebuie să fie întreg). Atunci vrem să arătăm ce este scăzut" unde scăzut "și ridicat" există valori actualizate pentru jos și sus, așa cum este definit mai jos. interval * cum_freq (a) scăzut "* scăzut + [─────────────────────] cum_freq cum_freq interval 1 din expresia (1) avem: , cum_freq este prin urmare scăzută " deoarece atât valoarea cât și low "și cum_freq> 0. interval * cum_freq (a) mare „* scăzut + [───────────────────────] - 1> = cum_freq interval (valoare-scăzută + 1) * cum_freq-1> = scăzut + ─────────── [─────────────────── -────────────1cum_freq interval de la expresie(1) avem: interval 1 interval-1 > = valoare + ─────────── [- ───── + 1 - ───────] = valoare... intervalul cum_freq Debordare negativă. După cum se arată în pseudocod, codificarea aritmetică funcționează prin scalarea probabilităților acumulate furnizate de model în interval pentru fiecare caracter transmis. Să presupunem că joasă și înaltă sunt atât de aproape unul de celălalt încât operația de scalare transformă diferitele simboluri primite de la model într-un număr întreg inclus în. În acest caz, codificarea ulterioară nu poate fi continuată. În consecință, codificatorul trebuie să se asigure că intervalula fost întotdeauna suficient de largă. Cel mai simplu mod de a face acest lucru este să oferiți o lățime a intervalului de cel puțin Frecvență_max - valoarea maximă a sumei tuturor frecvențelor acumulate. Cum puteți face această condiție mai puțin strictă? Operația de deplasare a biților explicată mai sus asigură că joasă și înaltă poate deveni periculos de aproape numai când Jumătate.Să zicem că se apropie atât de multFirst_qtr (*) Atunci următorii doi biți de ieșire vor avea valori reciproce: 01 sau 10. De exemplu, dacă următorul bit este zero (adică mare scade sub Jumătate și devine interval de lucru), iar următorul după ce devine unitate, deoarece intervalul trebuie să fie deasupra punctului de mijloc al intervalului de lucru. În schimb, dacă următorul bit s-a dovedit a fi 1, apoi va fi urmat de 0. Prin urmare, acum intervalul poate fi extins în siguranță la dreapta, doar dacă ne amintim că orice bit este următorul, după ce trebuie să fie transmis și fluxului de ieșire valoarea sa returnată. Programul se transformă într-un întreg interval, memorând în bits_to_follow valoarea bitului, după care este necesar să-i trimiteți returul. Toată ieșirea se face prin procedura bit_plus_follow (),și nu direct prin biți_ieșire (). Ce să faci dacă după această operație raportul(*) ramane corect? V caz general este necesar să se numără mai întâi numărul de extensii, iar apoi, după următorul bit, să se trimită către fluxul de ieșire numărul găsit de biți inversați. Urmând aceste instrucțiuni, codificatorul se va asigura că dupăoperaţiile în schimburi vor fi sau scăzut , (1a) sau scăzut . (1b) Aceasta înseamnă că, în timp ce intervalul întreg acoperit de frecvențele acumulate este plasat în sfertul său, reprezentat încode_value, nu va exista nicio problemă de depășire negativă. Acest lucru este potrivit aplică condiția: Top_value + 1 Max_frequency , 4 care este satisfăcut în program, deoarece. Max_frequency = 2 ^ 14-1 și Top_value = 2 ^ 16-1. Este imposibil fără creșterea numărului de biți alocați pentru cod_valori, utilizați mai mult pentru reprezentarea contoarelor de frecvență acumulată 14 biți. Am luat în considerare problema depășirii negative doar în raport cu codificatorul, deoarece la decodificarea fiecărui caracter, procesul urmează operația de codare, iar depășirea negativă nu se va produce dacă se realizează aceeași scalare în aceleași condiții.Revărsare. Acum să luăm în considerare posibilitatea de depășire în timpul înmulțirii întregi. Nu are loc depășirea dacă intervalul de producție * Max_frequencyse încadrează într-un cuvânt întreg, pentru că acumulatefrecvențele nu pot depăși Frecvență_max. Gamă are cea mai mare importanță în Top_value + 1, prin urmare produsul maxim posibil din program este 2 ^ 16 * (2 ^ 14-1), care este mai mic de 2 ^ 30. Tipul lung este folosit pentru a defini codul_valoare și interval, pentru a oferi precizie de 32 de biți pentru calculele aritmetice.Modele fixe. Cel mai simplu model este cel în care ratele de caractere sunt constante. Ratele de octeți acumulate care nu au apărut în eșantion primesc valori egale cu 1 (atunci modelul va funcționa și pentru fișierele binare, unde este totul 256 octeți). Un model strict este acela în care frecvențele de caractere ale textului se potrivesc exact cu prescripțiile modelului.Totuși, pentru ca acesta să fie cu adevărat strict, caracterele care nu apar în acest fragment trebuie să aibă contoare egale cu zero și nu 1 (în același timp sacrificând capacitatea de a codifica textele care conțin aceste caractere). În plus, contoarele de frecvență nu ar trebui să fie scalate la frecvența acumulată dată, așa cum era în program. Un model strict poate fi calculat și transmis înainte ca textul să fie trimis. Cleary și Whitten a arătat că atunci când conditii generale nu va da un general mai buncompresia sa în comparație cu codarea adaptivă descrisă mai jos.Model receptiv. Schimbă frecvențele caracterelor deja găsite în text. Inițial, toate contoarele pot fi egale, ceea ce reflectă absența datelor inițiale, dar pe măsură ce fiecare caracter de intrare este examinat, acestea se modifică, apropiindu-se de frecvențele observate. Atât codificatorul, cât și decodorul folosesc același lucru valorile initiale(de exemplu, contoare egale) și același algoritm de actualizare, care va permite modelelor lor să rămână mereu la același nivel. Codificatorul primește următorul caracter, îl codifică și modifică modelul. Decodorul determină următorul caracter pe baza modelului său actual și apoi îl actualizează. Procedură update_model (simbol) este numit de la codificare_simbol () și decode_symbol () după procesarea fiecărui caracter. Actualizarea modelului este destul de costisitoare din cauza necesității de a menține sumele acumulate. În program, contoarele de frecvență utilizate sunt plasate optim în matrice în ordinea scăderii valorilor lor, care este vedere eficientă căutare liniară auto-organizată. Procedură update_model () mai întâi verifică noul model pentru faptul că depășește limitele valorii frecvenței acumulate, iar dacă acesta este cazul, atunci scade toate frecvențele prin împărțirea la 2, având grijă totodată ca contoarele să nu se transforme în 0, și recalculează valorile acumulate. Apoi, dacă este necesar, update_model ()reordonează caracterele pentru a le redimensionaintroduceți curent în categoria corectă în raport cu ordinea frecvenței, alternând cu tabelele de conversie pentru a reflecta modificările. Ca urmare, procedura crește valoarea contorului de frecvență corespunzător și ordonează frecvențele acumulate corespunzătoare.Eficiența compresiei. La codificarea unui text cu o metodă aritmetică, numărul de biți dintr-un șir codat este egal cu entropia acestui text raportat la modelul utilizat pentru codare. Trei factori determină deteriorarea acestei caracteristici: * costul completării textului; * utilizarea aritmeticii de precizie neinfinită; * scalarea contoarelor astfel încât suma lor să nu depășească Max_frequency.Niciuna dintre acestea nu s-a dovedit a fi semnificativă. În ordinea evidențierii rezultatelor codificării aritmetice, modelul va fi considerat strict (în sensul definit mai sus). Codarea aritmetică ar trebui să trimită biți suplimentari la sfârșitul fiecărui text, depunând astfel eforturi suplimentare pentru completarea textului.Pentru a elimina ambiguitatea cu ultimul caracter, procedura done_encoding () trimite doi biți. În cazul în care înainte de codificare fluxul de biți trebuie blocat în caractere de 8 biți, va fi necesar să se închidă până la sfârșitul blocului. O astfel de combinație poate necesita în plus 9 biți. Costurile utilizării aritmeticii de precizie finită se manifestă prin reducerea reziduurilor în timpul divizării, ceea ce se poate observa în comparație cu entropia teoretică, care deduce frecvențe din contoare, care sunt și scalabile în timpul codificării. Aici costurile sunt nesemnificative - de ordine 10^-4 biți / caracter. Costurile suplimentare pentru scalarea contoarelor sunt parțial mai mari, dar totuși foarte mici. Pentru texte scurte (mai puțin de 2 ^ 14octeți) nu sunt. Dar chiar și cu texte înăuntru 10 ^ 5 - 10 ^ 6 octeți nac- costurile rezonabile, calculate experimental, sunt mai mici de 0,25%din șirul codificat.Model adaptiv în program, cu amenințarea depășirii cantității totale de frecvențe acumulate, valoarea Frecvență_max, decrementează toate contoarele. Acest lucru face mai dificilă cântărirea evenimentelor recente decât a celor anterioare. Astfel, valorile tind să urmărească modificările în secvența de intrare, ceea ce poate fi foarte util. (Am întâlnit cazuri când limităm contoarele la 6-7 biții au dat rezultate mai bune decât îmbunătățirea acurateței aritmeticii.) Desigur, acest lucru depinde de sursa la care este aplicat modelul.Implementare limitată. Constrângerile de lungime a cuvântului cauzate de posibilitatea de depășire pot fi generalizate presupunând că contoarele de frecvență sunt f cu biți și cod_valori cu c biți. Programul va funcționa corect când f și f + c unde p există precizia aritmeticii. În majoritatea implementărilor pe Si p = 31, dacă utilizați numere întregi precum lung și p = 32 dacă este lung nesemnat. În programul nostru f = 14și c = 16. Cu modificările corespunzătoare în anunturi pe lung fără semn poate fi f = 15 și c = 17. În limbaj de asamblare c = 16 este o alegere firească, deoarece accelerează uneleprimele operaţii de comparare şi manipulare a biţilor. Dacă limitezi p 16 biți apoi cel mai bun din valori posibile cși f există, respectiv 9 și 7, care nu vă permite să codificați alfabetul gratuit de 256 caractere, deoarece fiecare dintre ele va avea o valoare de contor de cel puțin unu. Cu un alfabet mai mic (de exemplu, de la 26 litere sau valori pe 4 biți) puteți încă să vă deplasați.Închidere. La sfârșitul procesului de codificare, trebuie să trimiteți un caracter final unic[este necesar dacă decodorul nu cunoaște lungimea textului],și apoi trimite destui biți dupăpentru a se asigura că șirul codificat intră în intervalul de lucru final. pentru că procedură done_encoding () poate fi sigur că joasă și înaltă limitat fie de expresie(1a) sau (1b), trebuie doar să treacă 01 sau 10 în consecință, pentru a elimina incertitudinea rămasă. Este convenabil să faceți acest lucru folosind procedura considerată anterior bit_plus_follow (). Procedura Input_bit (). va citi de fapt un pic mai mult din biții pe care output_bit () iese,pentru că trebuie să umple în continuare fundulsfârşitul tamponului. Nu contează care este sensul acestor biți, deoarece EOFdefinite unic de ultimii biți transmiși.Toate linkurile exacte către programul C al autorului Am distrus, dar în același timp am lăsat informații despre raporturile numelor modificărilorși proceduri, ceea ce este suficient pentru a restabili logicaprograme. Programul este foarte prost conceput și, prin urmare, cu greuiti va fi de folos (pe C poți scrie cu ușurință pe al tău), așa că am pusversiunea sa de asamblare, implementată Vitamina 'ohm şi accelerată eu fără a schimba algoritmul. Pentru a obține o viteză mai mareviteza de despachetare (viteza de ambalare este mai puțin importantă) trebuie schimbatăthread în partea de actualizare a modelului și căutare. Algoritm în aproape oricecazul va trebui schimbat, deoarece totul este susținut 256 literali și un singur model este stocat la un moment dat - asta nu este suficientpentru a scrie un bun ambalator. Cm. ARIF16m.H în aplicație.

Versiunea clasică a algoritmului

Compresia Huffman este înlocuită treptat de compresia aritmetică. Un rol în acest sens l-a jucat expirarea perioadelor de brevetare care limitează utilizarea compresiei aritmetice. În plus, algoritmul Huffman aproximează frecvențele relative de apariție a simbolurilor în flux prin frecvențe care sunt multipli ai unei puteri de doi (de exemplu, pentru simboluri a, b, c, d cu probabilități 1/2, 1/4, 1/8, 1/8, se vor folosi codurile O, 10, 110, 111), iar compresia aritmetică oferă cel mai bun grad de aproximare a frecvenței. Prin teorema lui Shannon cea mai buna compresieîn aritmetică binară, obținem dacă codificăm un caracter cu o frecvență relativă f cu folosind -log 2 (f) bit.

0.3 0,4 0.5 0.6 0.7

Frecvența relativă a simbolului

„^ ~” Compresie optimă
---- Metoda Huffman

Orez. 1.1. Graficul de comparație a codării optime și a codării Huffman

Graficul de mai sus compară codarea optimă și codarea Huffman. Se vede clar că într-o situație în care frecvențele relative nu sunt puteri de doi, compresia devine mai puțin eficientă (risipim mai mulți biți decât este necesar). De exemplu, dacă avem două personaje Ași B cu probabilitățile 253/256 și 3/256, atunci în mod ideal ar trebui să cheltuim pe un lanț de 256 de biți -log 2 (253/256) -253-bg 2 (3/256) -3 = 23,546, adică 24 de biți ... Când codificăm conform lui Huffman, vom codifica Ași B ca 0 și 1 și va trebui să cheltuim 1 -253 + 1 -3 = 256 biți, adică de 10 ori mai mult. Luați în considerare un algoritm care oferă un rezultat aproape de optim.

Compresia aritmetică este o tehnică destul de îngrijită, care se bazează pe un foarte idee simplă... Reprezentăm textul codificat ca o fracție, în timp ce construim fracția în așa fel încât textul nostru să fie prezentat cât mai compact posibil. De exemplu, luați în considerare construcția unei astfel de fracții pe un interval; B [c]),și intervalul pentru simbolul i-lea de flux codificat ca; B [c]), inclusiv 0,341. Enumerând toate simboluri posibile conform tabelului de mai sus, constatăm că doar intervalul este (fti-j - li-i); Salut= li.!+ b ■ (hi.! - li.i); dacă ((l t<= value) && (value < Salut)) pauză; ); DataFile.WriteSymbol (c ^);

unde valoare este numărul (fracția) citit din flux și Cu - caractere despachetate scrise în fluxul de ieșire. Când utilizați un alfabet de 256 de caractere Cj bucla interioară durează mult timp, dar o puteți accelera. Rețineți că din moment ce B [c ^ (\ = a; II delitel = 10

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

Jumătate = First_qtr * 2; // - 32768

Third_qtr - First_qtr * 3; // = 49152

bits_to_follow = 0; // Câți biți să ștergeți

în timp ce (nu DataFile.EOFO) (

c = DataFile.ReadSymbol (); // Citiți simbolul
j= IndexForSymbol (s); i ++; // Găsește-i indexul
li= li.j + b * (h i. 1 - li-x+ l) / delitel;
Salut= li.!+ b;
First_qtr = (h 0 + l) / 4; // = 16384

Jumătate = First_qtr * 2; // = 32768

Third_qtr = First_qtr * 3; // = 49152

valoare = CompressedFile.Readl6Bit ();

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

frecvență = ((valoare-2 i. 1 + l) * delitel-l) / (h i. I - 1 ±. X+ 1) ;

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

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

Salut= Sunt+ b * (h i. 1 - li.!+ l) / delitel - 1;

pentru (;;) (// Opțiuni de procesare

dacă (bună< Half) // переполнения

; // Nimic altceva ifdi> = Jumătate) (

2i- = Jumătate; hi- = Jumătate; valoare- = Jumătate; )

altfel dacă (di> = First_qtr) && (hi< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

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

Exercitiul. Sugerați exemple de secvențe comprimate de algoritm cu coeficienții maxim și minim.

După cum puteți vedea, ne luptăm cu inexactitățile aritmetice prin efectuarea de operații separate pe / și A, sincron în compresor și decompresor.

Pierderea nesemnificativă a preciziei (fracții de procent pentru un fișier suficient de mare) și, în consecință, o scădere a raportului de compresie în comparație cu algoritm perfect apar în timpul operației de divizare, când frecvențele relative sunt rotunjite la cel mai apropiat număr întreg, când ultimii biți sunt scrieți în fișier. Algoritmul poate fi accelerat prin reprezentarea frecvențelor relative, astfel încât divizorul să fie o putere de doi (adică, înlocuirea diviziunii cu o operație de deplasare pe biți).

Pentru a estima raportul de compresie prin algoritmul aritmetic al unui anumit șir, trebuie să găsiți numărul minim N, astfel încât lungimea intervalului de lucru la comprimarea ultimului caracter al lanțului ar fi mai mică de 1/2 ^ .. Acest criteriu înseamnă că în intervalul nostru există cu siguranță cel puțin un număr în reprezentare binară care după N-ro vor fi doar semne 0. Lungimea intervalului este ușor de citit, deoarece este egală cu produsul probabilităților tuturor simbolurilor.

Luați în considerare exemplul anterior al unui șir de două caractere l și B cu probabilităţi 253/256 şi 3/256. Lungimea ultimului interval de lucru pentru un șir de 256 de caractere Ași B cu probabilitățile indicate egale. Este ușor de calculat că necesarul N = 24 (1/2 24 = 5,96-10 "8), deoarece 23 oferă și interval mare(de 2 ori mai lat) și 25 nu este minim un număr care îndeplinește criteriul. S-a arătat mai sus că algoritmul Huffman codifică acest șir pe 256 de biți. Adică pentru exemplul considerat algoritm aritmetic oferă un avantaj de zece ori față de algoritmul Huffman și necesită mai puțin de 0,1 biți per simbol.

Exercitiul. Calculați estimarea raportului de compresie pentru linia "COV.KOROBA".

Ar trebui spuse câteva cuvinte despre algoritmul de compresie aritmetică adaptivă. Ideea sa este de a reconstrui tabelul de probabilitate b [f]în timpul împachetarii și despachetarea imediat după primirea următorului caracter. Un astfel de algoritm nu necesită stocarea valorilor probabilităților caracterelor în fișierul de ieșire și, de regulă, oferă un raport de compresie ridicat. Deci, de exemplu, un fișier precum un 1000 £ 1000 cu 1000 b / 1000 (unde gradul înseamnă numărul de repetări ale unui anumit caracter), algoritmul adaptiv va putea să se comprima mai eficient decât cheltuind 2 biți pe caracter. Algoritmul de mai sus se transformă pur și simplu într-unul adaptiv. Anterior, am salvat tabelul intervalelor într-un fișier, iar acum calculăm chiar în cursul compresorului și decompresorului, recalculăm frecvențele relative, ajustând tabelul intervalului în conformitate cu acestea. Este important ca modificările din tabel să aibă loc în compresor și decompresor în mod sincron, adică, de exemplu, după codificare lanțuri de lungime 100 tabelul de gamă ar trebui să fie exact același ca după decodare lanțuri de lungime 100. Această condiție este ușor de îndeplinit dacă schimbați masa după codificarea și decodificarea următorului caracter. Pentru mai multe detalii despre algoritmii adaptivi, vezi cap. 4.

Caracteristicile algoritmului aritmetic:

Cel mai bun și cel mai rău raport de compresie: cel mai bun> 8 (este posibilă codificarea mai puțin de un bit per simbol), cel mai rău - 1.

Avantajele algoritmului: Oferă un raport de compresie mai bun decât ritmul Algo-I Huffman (pe datele tipice cu 1-10%).

Caracteristici: precum și codarea Huffman, nu crește dimensiunea datelor originale în cel mai rău caz.

Codare pe intervale

Spre deosebire de algoritmul clasic, codarea pe intervale presupune că avem de-a face cu numere întregi discrete care pot lua număr limitat valorile. După cum sa menționat deja, intervalul inițial în aritmetica întregului este scris ca [OD) sau, unde N- numărul de valori posibile pentru variabila utilizată pentru a stoca limitele intervalului.

Pentru a comprima datele cel mai eficient, trebuie să codificăm fiecare caracter s prin -log 2 (Ј) biți, unde f,- frecvența simbolului s. Desigur, în practică, o astfel de precizie este de neatins, dar putem pentru fiecare personaj s atribuiți un interval de valori într-un interval , Prev_freq [c], 10);

Rezultat

Normalizare

Normalizare

Normalizare

După cum sa menționat deja, cel mai adesea nu are loc nicio transferare în timpul normalizării. Pornind de la aceasta, Dmitry Subbotin 1 a propus să renunțe complet la transfer. S-a dovedit că pierderea în compresie este destul de nesemnificativă, de ordinul câțiva octeți. Cu toate acestea, creșterea vitezei nu a fost foarte vizibilă. Principalul avantaj al acestei abordări este simplitatea și compactitatea codului. Iată cum arată funcția de normalizare pentru aritmetica pe 32 de biți:

♦ definiți CODEBITS 24

♦ defini TOP (l "CODEBITS)

♦ definiți BOTTOM (SUS „8)

♦ definiți BIGBYTE (0xFF „(CODEBITS-8))

void encode_normalize (void) (în timp ce (interval< BOTTOM) {

dacă (low & BIGBYTE == BIGBYTE &&

interval + (jos & BOTTOM-1)> = BOTTOM) interval = BOTTOM - (jos & BOTTOM-1); octet_ieșire (scăzut „24); gamă<<=8; low«=8; })

Se poate observa că reducerea forțată în timp util a valorii mărimii intervalului ne permite să evităm transferul. S-a întâmplat

când al doilea cel mai semnificativ octet scăzut este setat la OxFF și când valoarea mărimii intervalului este adăugată la low, are loc o transferare. Aceasta este procedura de normalizare optimizată:

void encode_normalize (void) (în timp ce ((low "low + range)) } }

void decode_normalize (void) (în timp ce ((low and low + range) }

Exercitiul. Aplicați codare distanțată fără întreruperi de linie „vacă. vaca”.

Acum există mulți algoritmi pentru comprimarea informațiilor. Cele mai multe dintre ele sunt cunoscute pe scară largă, dar există și unii algoritmi foarte eficienți, dar, totuși, puțin cunoscuți. Acest articol vorbește despre metoda de codificare aritmetică, care este cea mai bună dintre cele cu entropie, dar cu toate acestea foarte puțini oameni știu despre ea.
Înainte de a vorbi despre codificarea aritmetică, trebuie să spun câteva cuvinte despre algoritmul Huffman. Această metodă este eficientă atunci când ratele simbolurilor sunt proporționale cu 1/2 n (unde n este un număr întreg pozitiv). Această afirmație devine evidentă când vă amintiți că codurile Huffman pentru fiecare caracter constau întotdeauna dintr-un număr întreg de biți. Să luăm în considerare situația în care frecvența de apariție a unui simbol este 0,2, atunci codul optim pentru codificarea acestui simbol ar trebui să aibă o lungime de –log 2 (0,2) = 2,3 biți. Este clar că codul de prefix Huffman nu poate avea această lungime, adică. acest lucru duce în cele din urmă la o comprimare slabă a datelor.
Codarea aritmetică este concepută pentru a rezolva această problemă. Ideea principală este de a atribui coduri nu personajelor individuale, ci secvențelor acestora.
Mai întâi, ne vom uita la ideea din spatele algoritmului, apoi ne vom uita la un mic exemplu practic.
Ca în toți algoritmii de entropie, avem informații despre frecvența de utilizare a fiecărui caracter al alfabetului. Aceste informații reprezintă sursa metodei luate în considerare. Acum să introducem conceptul de segment de flanșă. Lucrătorul este numit jumătate de interval)

Top articole similare