Compresia de informații devine

In fiecare zi folosim diferite Archiver: zip, rar, asul tot în jurul nostru.
Fișierele grafice și audio conțin, de asemenea date comprimate. Dacă avem nevoie de a utiliza






compresie în prog ei, atunci vom folosi diferite dll'ki, dintre care multe sunt plătite.
Sharevarnost - nu este singura proprietate a componentelor software, a interfera cu relația lor normală
utilizați. Dacă, de exemplu, comprima waw sau bmp-fișier Archiver, atunci
aceasta va da metoda mod semnificativ special pentru un anumit tip de date, și anume,
Metoda ar trebui să țină cont de particularitățile unui anumit tip de date. Prin urmare, este util să fie capabil să realizeze propria lor de compresie.
În acest articol vă voi arăta cum să comprime toate informațiile și ia în considerare una dintre metodele de compresie.

Clasificarea metodelor de comprimare

În primul rând, nici unul dintre metoda de compresie nu poate stoarce date ca codificare
ar trebui să fie lipsită de ambiguitate. Provocarea este de a construi regula de codificare pe care
cele mai frecvente rapoarte ar corespunde posturi la lungime. Prin urmare, orice metodă de comprimare trebuie să se bazeze pe orice presupuneri despre
Structura probabilist de date comprimate. De exemplu, pentru textul într-o anumită limbă cunoscută
frecvență litere. Cel mai frecvent utilizat este presupunerea că mai
probabil raportul va întâlni același șir de caractere. De exemplu, în textul acestei
articol cuvântul „comprimare“ este cea mai comună. Dacă nu știm nimic despre structura probabilistică
comprimat de date și să trateze toate mesajele aceeași lungime sunt la fel de probabile, noi nu facem nimic
comprima.

Metodele de compresie sunt împărțite în statistică și vocabularul. Dicționarul metode sunt că
în cazul unui subșir al reuniunii, care a fost deja găsit înainte, pentru a codifica link-ul care
Este nevoie de mai puțin spațiu decât subsirul actuale. O metodă clasică este vocabularul
Lempel-Ziv (LZ). Toate metodele folosite în prezent sunt doar dicționar
modificări LZ.

Entropia de codificare este de a codifica fiecare caracter, dar
folosesc coduri de lungime variabilă. Un exemplu de astfel de metode este metoda Huffman
(Huffman). De obicei, dicționar și metode statistice sunt combinate, deoarece fiecare are propria sa
beneficii.

Observăm un lucru, care, pentru un motiv oarecare, nu este evident pentru unii „teoreticieni“.
reguli de codificare a determinat structura de date probabilistic, ceea ce înseamnă că decompresor
Voi, înainte de începerea decodificarea îl cunosc deja. Dacă vom lua de statistici concrete
posturi (cum comprimă mai bine), atunci ar trebui să treacă în mod direct sau indirect, împreună cu comprimat
mesaj, și nu este clar dacă dimensiunea totală mai mică.

Este dovedit faptul că cea mai mică posibilă dimensiunea medie comprimată a mesajului este egal cu entropia
ansamblul de mesaje posibile, rotunjite în exces. Entropia se calculează după cum urmează:

H = -suma (p [i] * log (p [i]))

în cazul în care suma - suma i, p [i] - probabilitatea mesajului i-lea, log - logaritmul în baza 2.
Entropia unui mesaj complex este suma entropiilor mesajelor sale simple constitutive.

Dacă codifica fiecare caracter separat, lungimea fiecărui cod de mesaj trebuie să fie
este -log egal (p). Ie de exemplu, daca probabilitatea simbolului 0.3, codul său ar trebui să aibă o lungime
1,73 biți la un moment dat ca lungimea reală a întregului. Puteți îmbunătăți rezultatele, în cazul în care nu se reduce






sarcina de a codifica caractere individuale.

Această metodă este fundamental diferită de toate metodele discutate anterior. principalul său
se obține avantajul că limita teoretică de compresie. Luați în considerare această metodă în detaliu. Întregul mesaj este reprezentat de un singur număr în modul următor. numărul trebuie să
în intervalul de la 0 la 1. Acest interval este împărțit în părți, care sunt proporționale cu probabilitățile
primele valori de caractere. Porțiunea selectată care corespunde caracterului și este împărțit în părți
Valoarea probabilă de-al doilea simbol, etc.

novaya_nizhnyaya_granitsa nizhnyaya_granitsa + = lățimea * S [i]
novaya_shirina = lățimea * p [i]

unde p [i] - probabilitatea simbolului i-lea, S [i] - suma probabilităților simbolurilor cu indici
mai puțin eu.

După procesarea toate mesajele acestui algoritm poate înregistra numai orice
numărul intervalului rezultat. Numărul de biți necesari pentru a înregistra acest număr,
aproximativ egală cu minus logaritmul lățimea fantă. Lățimea fantei este egală cu produsul dintre
probabilități de simboluri, de exemplu, probabilitatea întregul mesaj. astfel Lungimea de cod este
-log (p), adică limita teoretică. În practică, vom lucra cu variabilele de lungime limitată,
și precizia calculelor vor fi limitate, ceea ce înseamnă că comprimarea este încă un pic mai rău.

Proiectul este atașat la acest articol, compilat pe Visual Studio .NET.
Aceasta este punerea în aplicare a codificare aritmetică, comprimarea fișierelor, tratarea octeții ca de caractere.
Conținutul fișierului este tratat ca un proces Markov de ordinul 1, adică. e. distribuție
caractere depinde de probabilitatea de caracterul anterior. Clasa procese CMarkovProcessDef
datele stocate în resursa într-un format special. Aceste date sunt generate ca urmare a
prelucrare cantități mari de text, adică. e. fișiere de text, cel mai probabil, va fi comprimat
bine, și dacă încercați să strângeți unele binare, dimensiunea fișierului „comprimat“ va fi mai mare
sursă. În scopul de a obține o metodă de compresie pentru tipul de date, datele trebuie să fie înlocuit pe
probabilități simbol. În plus, simbolul - nu este în mod necesar un octet de date necomprimate. De exemplu,
în cazul în care există o coloană a tabelului, în cazul în care valorile trebuie să fie unic, fiecare valoare - l
simbol, iar după caracterul este găsit, l-am resetat la zero, probabilitatea. Limita inferioară a lățimii intervalului este stocat în variabile întregi dwBuf1 și dwBuf2.
Dacă după procesarea următorul simbol limitele octeții superioare sunt egale
(Rețineți că acest lucru nu este același lucru, că dacă lățimea ridicată octet este egal cu zero), atunci
octeți de rezultatul final corespunzător va fi egal cu această valoare și poate fi
scrie într-un fișier. Scrie-l și mutați buffer-1 octet. La despachetarea cu excepția variabilelor sunt tratate la fel ca și în ambalaj, noi
Am nevoie de unul, în cazul în care vor exista informații din dosar. Pentru a determina caracterul următor, trebuie să
găsi simbolul cu cel mai mic număr astfel încât S [n] * dwBuf2> = dwBuf3, adică P [n]> = dwBuf3 / dwBuf2. Atunci când se lucrează cu numere întregi, există o problemă: ne reprezintă probabilitatea (fracțională
numere de la 0 la 1) integer variabil (0x100000000 * p). Pentru înmulțire și împărțire de care au nevoie
proceduri specifice: prin înmulțirea lua cuvântul mai în vârstă de 32 de biți rezultat pe 64 de biți, și fisiune
împărțiți numărul înmulțit cu 2 ^ 32. Compilatorul nu poate umnozhitv DWORD la DWORD, a pus rezultatul
64-bit variabilă - este lipsa limbajului C ++. Așa că a trebuit să scrie proceduri speciale
asamblor.

anula CArithmCompressorDlg :: OnBnClickedCompress ()
CFileDialog dlg1 (TRUE);
în cazul în care (dlg1.DoModal () = IDOK!) întoarcere;
CFileDialog dlg2 (FALSE, «comprimat», 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, «* .compressed | * .compressed | Toate fișierele | * * ||.»);
în cazul în care (dlg2.DoModal () = IDOK!) întoarcere;

CFile fișier1 (dlg1.GetPathName (), CFile :: modeRead);
CFile file2 (dlg2.GetPathName (), CFile :: modeCreate | CFile :: modeWrite);

BYTE b;
ULONGLONG fs = file1.GetLength ();

file2.Write (# 038; fs, 8); // Scrieți dimensiunea fișierului original

// m_mpd - un CMarkovProcessDef clasă de obiecte
m_mpd.ResetProcess (); // reseteaza datele din caracterele anterioare

// începe Această comprimare
// Start intervalul - de la 0x00000000 la 0xFFFFFFFF
DWORD dwBuf1 = 0; // Limita inferioară
DWORD dwBuf2 = 0xFFFFFFFF; // Lățime
DWORD DWW; // variabilă temporară

în timp ce (file1.Read (# 038; b, 1))
// Se calculează noul interval
dacă (b> 0) DWW = MulHigh (m_mpd.GetDistribution (b-1), dwBuf2); altfel DWW = 0;
/ *
m_mpd.GetDistribution (b-1) - Această S [b], o m ..
p [b] - l m_mpd.GetDistribution (b) - m_mpd.GetDistribution (b-1)

Înlocuiți această funcție punerea sa în aplicare și de a obține o metodă de compresie pentru tipul de date.
* /
dwBuf1 + = DWW;
if (b = 0; -j) if (file1.Read (((LPBYTE) # 038; dwBuf3) + j, 1) == 0) ((LPBYTE) # 038; dwBuf3) [j] = 0xFF;

// metoda de împărțire în două Cautare
face
m = (l + h) / 2;
if (h 0) DWW = MulHigh (m_mpd.GetDistribution (m-1), dwBuf2); altfel DWW = 0;
dwBuf1 + = DWW;
dwBuf3 - = DWW;
if (m

Arată acest articol unui prieten: