Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Formula e kodimit aritmetik. Një përmbledhje e Algoritmeve të Kompresimit pa Humbje

Kodimi aritmetik

Kodimi aritmetik është një metodë që lejon paketimin pa humbje të karaktereve të alfabetit të hyrjes, me kusht që të dihet shpërndarja e frekuencës së këtyre karaktereve. Kodimi aritmetik është optimal, duke arritur raportin teorik të kompresimit të kufizuar. Kodimi aritmetik - kodi i bllokut dhe i daljes është unik për secilin prej mesazheve të mundshme hyrëse; nuk mund të zbërthehet në kode individuale të karaktereve, ndryshe nga kodet Huffman, të cilat janë jo-blloqe, d.m.th. secilës shkronjë të alfabetit të hyrjes i caktohet një kod specifik i daljes.

Teksti i ngjeshur nga koduesi aritmetik konsiderohet si një pjesë binare nga intervali ), dhe intervali për simbolin /-të të koduar të rrymës si ; b[c]), duke përfshirë 0.341. Duke kërkuar të gjitha personazhet e mundshëm sipas tabelës së mësipërme, gjejmë se vetëm intervali - (fti-j - li-i); përshëndetje= li!+ b ■ (hi.! - li.i); nëse ((lt<= value) && (value < përshëndetje)) pushim; ); DataFile.WriteSymbol(c^) ;

ku vlera është numri (fraksioni) i lexuar nga rryma, dhe nga - karaktere të papaketuara të shkruara në rrjedhën dalëse. Kur përdorni një alfabet prej 256 karakteresh cj Laku i brendshëm kërkon shumë kohë për t'u përfunduar, por mund të përshpejtohet. Vini re se që nga b[c^ (\=a; II ndarës=10

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

Gjysma = First_qtr*2; // - 32768

Third_qtr - First_qtr*3;// = 49152

bit_për_ndjekim=0; // Sa bit për të rivendosur

ndërsa (jo DataFile.EOFO) (

c = DataFile.ReadSymbol(); // Lexoni karakterin
j= IndexForSymbol(c); i++; // Gjeni indeksin e tij
li= li.j + b*(h i . 1 - li-x+l)/pjestues;
përshëndetje= li!+ b;
First_qtr = (h 0 +l)/4; // = 16384

Gjysma = First_qtr*2; // = 32768

Third_qtr = First_qtr*3; // = 49152

vlera=CompressedFile.Readl6Bit();

për(i=l; i< CompressedFile.DataLengthO; i++){

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

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

li = 1s+ blj-l]*(bi.!- li- u + l) / ndarës;

përshëndetje= Une jam+ b*(h i . 1 - li.!+ l) / ndarës - 1;

për(;;) ( // Opsionet e përpunimit

nëse (përshëndetje< Half) // переполнения

; // Asgjë tjetër ifdi >= Gjysma) (

2i-=Gjysma; hi=Gjysma; vlera-= Gjysma; )

ndryshe nëse (di >= First_qtr)&& (hi< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

vlera+=vlera+File e kompresuar.ReadBit(); } DataFile.WriteSymbol(c);

Ushtrimi. Jepni shembuj të sekuencave të ngjeshura nga algoritmi me koeficientë maksimalë dhe minimalë.

Siç mund ta shihni, ne po luftojmë me pasaktësitë e aritmetikës duke kryer operacione të veçanta në /, dhe A, në mënyrë sinkronike në kompresor dhe dekompresor.

Humbje e parëndësishme e saktësisë (fraksione të përqindjes për një skedar mjaftueshëm të madh) dhe, në përputhje me rrethanat, një rënie në shkallën e kompresimit në krahasim me algoritmi ideal ndodhin gjatë operacionit të ndarjes, kur frekuencat relative janë të rrumbullakosura në një numër të plotë, kur bitet e fundit shkruhen në skedar. Algoritmi mund të përshpejtohet duke paraqitur frekuencat relative në mënyrë që pjesëtuesi të jetë një fuqi prej dy (d.m.th., duke zëvendësuar ndarjen me një veprim zhvendosjeje bit).

Për të vlerësuar shkallën e ngjeshjes me algoritmin aritmetik të një vargu të caktuar, duhet të gjeni numrin minimal N, e tillë që gjatësia e intervalit të punës gjatë ngjeshjes së karakterit të fundit të vargut do të ishte më e vogël se 1/2^.. Ky kriter do të thotë që brenda intervalit tonë sigurisht që ka të paktën një numër në paraqitje binare e cila pas N-ro shenja do të jetë vetëm 0. Gjatësia e intervalit është e lehtë për t'u lexuar, pasi është e barabartë me produktin e probabiliteteve të të gjithë karaktereve.

Merrni parasysh shembullin e mëparshëm të një vargu me dy karaktere l dhe Kommersant me probabilitete 253/256 dhe 3/256. Gjatësia e intervalit të fundit të punës për një varg prej 256 karakteresh por Dhe b me probabilitetet e treguara është e barabartë. Është e lehtë të llogaritet se nevoja N=24 (1/2 24 = 5.96-10" 8), pasi 23 jep gjithashtu interval i gjatë(2x më e gjerë) ndërsa 25 jo minimale numër që plotëson kriteret. Më sipër u tregua se algoritmi Huffman e kodon këtë zinxhir në 256 bit. Kjo do të thotë, për shembullin e konsideruar, algoritmi aritmetik jep një avantazh dhjetëfish mbi algoritmin Huffman dhe kërkon më pak se 0.1 bit për simbol.

Ushtrimi. Llogaritni raportin e kompresimit për vargun "BOX.BOX".

Duhet thënë disa fjalë për algoritmin e kompresimit aritmetik adaptiv. Ideja e tij është të rindërtojë tabelën e probabilitetit b[f] gjatë paketimit dhe shpaketimit direkt pas marrjes së personazhit tjetër. Një algoritëm i tillë nuk kërkon ruajtjen e vlerave të probabiliteteve të simboleve në skedarin e daljes dhe, si rregull, jep një shkallë të lartë kompresimi. Kështu, për shembull, një skedar i formës 1000 £ 1000 me 1000 b/1000 (ku eksponenti nënkupton numrin e përsëritjeve të një karakteri të caktuar) algoritmi adaptiv mund të kompresojë në mënyrë më efikase sesa të shpenzojë 2 bit për karakter. Algoritmi i mësipërm shndërrohet thjesht në një përshtatës. Më parë, ne e ruanim tabelën e diapazonit në një skedar, dhe tani ne llogarisim menjëherë gjatë funksionimit të kompresorit dhe dekompresorit, rillogaritim frekuencat relative, duke rregulluar tabelën e diapazonit në përputhje me to. Është e rëndësishme që ndryshimet në tabelë të ndodhin në kompresor dhe dekompresor në mënyrë sinkrone, d.m.th., për shembull, pas kodimi zinxhirët me gjatësi 100, tabela e diapazonit duhet të jetë saktësisht e njëjtë si pas dekodimi zinxhirë me gjatësi 100. Ky kusht plotësohet lehtë nëse ndryshon tabelën pas kodimi dhe deshifrimi i karakterit të ardhshëm. Për më shumë informacion rreth algoritmeve adaptive, shihni kapitullin. 4.

Karakteristikat e algoritmit aritmetik:

Raporti më i mirë dhe më i keq i kompresimit: më i miri > 8 (më pak bit për karakter të mundshëm), më i keqi - 1.

Përparësitë e algoritmit: siguron një shkallë më të mirë kompresimi sesa ritmi i algoritmit Huffman-I (në të dhënat tipike me 1-10%).

Karakteristikat: si dhe kodimi i Huffman nuk rrit madhësinë e të dhënave origjinale në rastin më të keq.

Kodimi i intervalit

Ndryshe nga algoritmi klasik, kodimi i intervalit supozon se kemi të bëjmë me vlera të plota diskrete që mund të marrin numër i kufizuar vlerat. Siç u përmend tashmë, intervali fillestar në aritmetikën e numrave të plotë shkruhet si [OD) ose , ku N- numri vlerat e mundshme një variabël që përdoret për të ruajtur kufijtë e intervalit.

Në mënyrë që të kompresojmë të dhënat në mënyrë më efikase, duhet të kodojmë çdo karakter s nëpërmjet -log 2 (Ј) bit, ku f,- frekuenca e simboleve s. Sigurisht, në praktikë, një saktësi e tillë është e paarritshme, por ne mundemi për çdo personazh s caktoni një varg vlerash në interval , Prev_freq[c], 10);

Rezultati

Normalizimi

Normalizimi

Normalizimi

Siç është përmendur tashmë, më shpesh nuk ka asnjë transferim gjatë normalizimit. Bazuar në këtë, Dmitry Subbotin 1 propozoi të braktiste plotësisht transferimin. Doli se humbja në kompresim është mjaft e parëndësishme, në rendin e disa bajteve. Sidoqoftë, fitimi në shpejtësi nuk ishte gjithashtu shumë i dukshëm. Avantazhi kryesor i kësaj qasjeje është thjeshtësia dhe kompaktësia e kodit. Ja se si duket funksioni i normalizimit për aritmetikën 32-bit:

♦ përkufizoni KODEBITET 24

♦përcakto TOP (l«KODEBITË)

♦ përkufizo BOTTOM (TOP»8)

♦përcaktoni BIGBYTE(0xFF"(CODEBITS-8))

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

nëse (i ulët & BIGBYTE == BIGBYTE &&

varg + (i ulët & POSHT-1) >= POSHT) varg = POSHT - (i ulët & POSHTË-1); output_byte (i ulët"24); varg<<=8; low«=8; })

Mund të shihet se zvogëlimi i detyruar në kohë i vlerës së madhësisë së intervalit na lejon të shmangim transferimin. Ndodh

kur byte-i i dytë më i rëndësishëm është vendosur në 0xFF dhe shtimi i diapazonit në rezultate të ulëta në një transferim. Kështu duket procedura e optimizuar e normalizimit:

void encode_normalize(void) ( while((i ulët " i ulët+varg) } }

void decode_normalize(void) ( while((i ulët dhe i ulët+varg) }

Ushtrimi. Aplikoni kodimin e hapësirës pa e mbështjellur në një varg "lopë lopë".

Skema e kompresimit LZW

Kodimi i Huffman

Kodimi në grup

Kompresimi i imazhit

Kompresimi i imazhit bazohet në parimet e përgjithshme të ngjeshjes së të dhënave. Teprica eliminohet - në vend të një grupi pikselësh me të njëjtën ngjyrë, ruhen të dhënat për ngjyrën dhe numrin e përsëritjeve. Përdoret gjithashtu kodimi. Por çmimi për këtë është papajtueshmëria e formateve të skedarëve, rreziku që disa programe të mos jenë në gjendje të lexojnë figurën. Ka edhe skedarë vetë-ekstraktues që përdorin të ashtuquajturin kompresim të brendshëm, dmth. programi i skanimit është i integruar në strukturën e skedarit.

Një nga metodat më të thjeshta të kompresimit është kodimi në grup ose kompresimi në grup. Një emër tjetër është "ngjeshja RLE" (kodimi me gjatësi të gjatë). Ideja është që në vend të përsëritjes së pikselëve, të ruhet informacioni për ngjyrën e pikës dhe numrin e përsëritjeve. Paraqitja e të dhënave ka opsione: fillimisht mund të regjistrojë ngjyrën, pastaj sasinë ose anasjelltas. Kjo krijon probleme me riprodhimin. Për shumicën e skedarëve raster, veçanërisht për ato fotorealiste, kompresimi RLE nuk është efektiv, sepse numri i pikselëve që përsëriten është i vogël. Ka edhe një humbje të panevojshme të burimeve.

Kodimi Huffman është një skemë e përgjithshme kompresimi. Qasja u krijua në 1952 për skedarët e tekstit. Ka shumë opsione. Ideja kryesore është të caktohet një kod binar për çdo element unik, dhe gjatësia e këtyre kodeve është e ndryshme. Për elementët që përsëriten më shpesh, përdoren kode më të shkurtra. Detyrat ruhen në një tabelë kërkimi, e cila ngarkohet në programin e dekodimit përpara vetë kodeve. Ekzistojnë algoritme të ndryshme për ndërtimin e kodeve. Raporti i ngjeshjes vlerësohet si 8: 1 . Për skedarët me sekuenca të gjata, skema Huffman nuk funksionon shumë mirë. Kompresimi i grupit është më i mirë këtu. Sepse statistikat janë të nevojshme për të ndërtuar kode, zakonisht përdoren 2 kalime. Fillimisht krijohet një model statistikor, më pas kryhet kompresimi (kodimi) aktual. Sepse Puna me kode me gjatësi të ndryshueshme kërkon kohë, kodimi dhe dekodimi janë të gjata.

Metoda është emëruar sipas shkronjave të para të emrave të zhvilluesve: Lempel, Ziv, Welch. Zhvillimi 1984. Në fillim, metoda ishte menduar për zbatimin e harduerit. Ashtu si algoritmi Huffman, algoritmi LZW ka disa variante. Ideja është të kërkoni për modelet e përsëritura të pikselave dhe t'i kodoni ato. Tabela e kodit krijohet jo para kodimit, por gjatë kodimit, gjë që e bën algoritmin adaptiv. Konsideroni sekuencën "ababaaaacaaaad". Lëreni çdo shkronjë të kodohet në imazh me një vlerë 2-bit. Tabela fillestare e kodit kodon çdo objekt atomik: a - 00, b - 01, c - 10, d - 11. Më pas, algoritmi vazhdon me kërkimin e sekuencave. Mund të njohë vetëm sekuenca me 1 shkronja. Sekuenca e parë me 2 shkronja nuk njihet dhe duhet të kodohet. Sepse Gjatësia e kodit është shteruar, është rritur me 1: a - 000, b - 001, c - 010, d - 011, ab - 100. Njihet kombinimi i mëposhtëm me 2 shkronja. Çdo shkronjë kishte një përshkrim 2-bit. Duhen 2 * 2 = 4 bit për sekuencë. Kur zëvendësojmë një sekuencë me një kod 3-bitësh, ne kursejmë 1 bit në çdo shfaqje të sekuencës. Raporti tipik i ngjeshjes për metodën 3: 1 . Imazhet me modele ngjyrash të përsëritura janë të ngjeshura në 10: 1 . Fotografitë dhe imazhet e skanuara pa modele nuk ngjeshen mirë.

Kur i përgjigjeni kësaj pyetjeje, është e nevojshme të shpjegoni konceptin e "kodimit aritmetik", ta krahasoni atë me metodat e tjera të kodimit të njohura për ju dhe të tregoni për algoritmin për ndërtimin e kodit aritmetik të një mesazhi të caktuar.

Kodimi aritmetik është një nga algoritmet e kompresimit të entropisë. Algoritmi i kodimit aritmetik siguron një raport pothuajse optimal të kompresimit për sa i përket vlerësimit të entropisë së kodimit Shannon. Çdo personazh kërkon pothuajse H pak ku H- entropia informative e burimit.

Kodimi aritmetik është një metodë që ju lejon të paketoni karakteret e alfabetit të hyrjes pa humbje, me kusht që shpërndarja e frekuencës së këtyre karaktereve të njihet dhe të jetë më optimale, sepse arrihet kufiri teorik i raportit të ngjeshjes.

E vlerësuar e kërkuar sekuenca e karaktereve, kur kompresohet me metodën e kodimit aritmetik konsiderohen si disa fraksion binare nga intervali)

Artikujt kryesorë të lidhur