Codificare delta

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 22 septembrie 2014; verificările necesită 9 modificări .

Codificarea Delta este o  modalitate de a reprezenta datele ca o diferență ( delta ) între datele consecutive în loc de datele în sine.

Poate cel mai simplu exemplu este stocarea valorilor octetilor ca diferențe (delte) între valori consecutive, spre deosebire de valorile în sine. Deci, în loc de 2, 4, 6, 9, 7, vom stoca 2, 2, 2, 3, -2. Acest lucru nu este foarte util atunci când este utilizat singur, dar poate fi util dacă trebuie să comprimați în continuare aceste date, care au adesea valori duplicate. De exemplu, formatul audio IFF 8SVX aplică această codificare datelor audio pure înainte de a le aplica compresie. Doar mostre de sunet pe 8 bițisunt bine comprimate în cazul codificării delta, iar în cazul eșantioanelor de 16 biți și mai mari, această metodă funcționează mai rău. Prin urmare, algoritmii de compresie aleg adesea codificarea delta numai atunci când compresia este mai bună cu ea decât fără ea. Cu toate acestea, în compresia video, cadrele delta pot reduce semnificativ dimensiunea cadrului și sunt utilizate în aproape fiecare codec video.

O variantă de codificare delta care codifică diferențele dintre prefixele și sufixele șirurilor se numește codificare incrementală . Este deosebit de eficient pentru liste sortate cu mici diferențe între șiruri, cum ar fi o listă de cuvinte dintr -un dicționar .

În transmisia de rețea codificată delta, unde doar o singură copie a fișierului este disponibilă la fiecare capăt al canalului de comunicație, se folosesc coduri speciale de corectare a erorilor pentru a detecta ce părți ale fișierului s-au schimbat față de versiunea anterioară.

Codificarea Delta este folosită ca pas preliminar pentru mulți algoritmi de compresie, cum ar fi RLE și în indexurile inversate ale motoarelor de căutare. Natura datelor care trebuie codificate afectează foarte mult eficiența compresiei. Codificarea Delta crește raportul de compresie atunci când datele au variații mici sau constante (cum ar fi un gradient într-o imagine); pentru datele generate de un generator de numere aleatorii cu o distribuție uniformă, factorul de compresie nu se va schimba prea mult.

Codificarea Delta face imposibilă accesarea aleatorie a datelor, deoarece pentru a accesa un element de matrice, este necesar să se însumeze valorile tuturor celor anterioare. Dacă este totuși necesar, se utilizează o versiune bloc a codării delta, în care sunt codificate blocuri de o anumită lungime. Apoi este necesar doar să însumați valorile de la începutul blocului căruia îi aparține elementul solicitat, dar nu întregul fișier. Mărimea blocului este aleasă în funcție de aplicație, de obicei pe baza rezultatelor de sincronizare.

Codificare diferențială

Ar trebui făcută o distincție între codificarea delta și codificarea diferită . Codificarea Delta găsește diferența dintre elementele aceleiași secvențe, în timp ce codificarea diferită compară două surse de date diferite, indicând diferențele dintre ele. Codificarea diferită este implementată în utilitarul standard Unix diff , precum și pentru a reduce cantitatea de trafic Internet în protocolul HTTP conform RFC 3229 .

Exemple de implementare

Următorul cod C implementează o formă simplă de codificare și decodare delta pe loc:

void delta_encode ( unsigned char * buffer , lungime int ) { caracter nesemnat ultimul = 0 ; pentru ( int i = 0 ; i < lungime ; i ++ ) { unsigned char current = buffer [ i ]; buffer [ i ] = curent - ultimul ; ultimul = curent ; } } void delta_decode ( unsigned char * buffer , lungime int ) { caracter nesemnat ultimul = 0 ; pentru ( int i = 0 ; i < lungime ; i ++ ) { unsigned char delta = buffer [ i ]; buffer [ i ] = delta + ultimul ; ultimul = buffer [ i ]; } }

Documentație:

În funcția delta_encode: *funcția ia ca argumente o matrice și lungimea matricei, dacă lungimea nu a fost trecută, atunci matricea nu este procesată *Variabilele curente sunt inițializate pentru a stoca ultimul element și ultimul pentru a stoca ultimul număr. *inițializarea buclei, unde i este un numărător. Într-un ciclu *stocarea caracterului la numărul i în matrice *calculați diferența dintre numărul elementului i și i-1, primul element nu se modifică și atribuiți diferența acestui element *schimbați valoarea ultimului cu valoarea elementului i înainte de modificare În funcția delta_decode *inițializarea unei variabile pentru a stoca ultimul caracter *inițializarea buclei, unde i este un numărător Într-o buclă: *adăugând la acest element valoarea elementului anterior *salvați valoarea acestui element

Vezi și