Delta-koodaus

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 22. syyskuuta 2014 tarkistetusta versiosta . tarkastukset vaativat 9 muokkausta .

Delta - koodaus on tapa esittää tiedot  erona ( delta ) peräkkäisten tietojen välillä itse tiedon sijaan.

Ehkä yksinkertaisin esimerkki on tallentaa tavuarvot eroina (deltoja) peräkkäisten arvojen välillä, toisin kuin itse arvot. Joten 2, 4, 6, 9, 7 sijasta tallennamme 2, 2, 2, 3, −2. Tämä ei ole kovin hyödyllinen yksinään käytettynä, mutta siitä voi olla apua, jos sinun on pakattava edelleen näitä tietoja, joilla on usein päällekkäisiä arvoja. Esimerkiksi IFF 8SVX -äänimuoto käyttää tätä koodausta puhtaaseen äänidataan ennen sen pakkaamista. Vain 8-bittiset ääninäytteet pakkaavat hyvin delta-koodauksen tapauksessa, ja 16-bittisten ja sitä korkeampien näytteiden tapauksessa tämä menetelmä toimii huonommin. Siksi pakkausalgoritmit valitsevat usein delta-koodauksen vain silloin, kun pakkaus on parempi sen kanssa kuin ilman sitä. Kuitenkin videopakkauksessa delta-kehykset voivat pienentää kehyskokoa merkittävästi, ja niitä käytetään melkein kaikissa videokoodekeissa.

Delta-koodauksen muunnelmaa, joka koodaa merkkijonojen etuliitteiden tai jälkiliitteiden väliset erot, kutsutaan inkrementaaliseksi koodaukseksi . Se on erityisen tehokas lajiteltuihin luetteloihin, joissa on pieniä eroja merkkijonojen välillä, kuten sanaluettelon sanaluettelossa .

Delta-koodatussa verkkosiirrossa, jossa vain yksi kopio tiedostosta on saatavilla viestintäkanavan molemmissa päissä, käytetään erityisiä virheenkorjauskoodeja havaitsemaan, mitkä tiedoston osat ovat muuttuneet edellisestä versiosta.

Delta-koodausta käytetään monien pakkausalgoritmien, kuten RLE , ja käänteisten hakukoneiden indeksien alustavana vaiheena. Koodattavan tiedon luonne vaikuttaa suuresti pakkaamisen tehokkuuteen. Delta-koodaus lisää pakkaussuhdetta, kun tiedoissa on vain vähän tai jatkuvaa vaihtelua (kuten kuvan gradientti); satunnaislukugeneraattorin tuottamien tietojen osalta, joilla on tasainen jakautuminen, pakkauskerroin ei muutu paljon.

Delta-koodaus tekee mahdottomaksi pääsyn tietoihin satunnaisesti, koska taulukon elementtiin pääsemiseksi on tarpeen laskea yhteen kaikkien aiempien arvot. Tarvittaessa käytetään deltakoodauksen lohkoversiota, johon koodataan tietyn pituisia lohkoja. Sitten on tarpeen vain summata arvot sen lohkon alusta, johon vaadittu elementti kuuluu, mutta ei koko tiedostoa. Lohkon koko valitaan sovelluksen mukaan, yleensä ajoitustulosten perusteella.

Diff-koodaus

Delta- ja diff -koodauksen välillä on tehtävä ero . Delta-koodaus löytää eron saman sekvenssin elementtien välillä, kun taas diff-koodaus vertaa kahta eri tietolähdettä osoittaen niiden väliset erot. Diff-koodaus on toteutettu standardi Unix - apuohjelmassa diff , sekä vähentämään Internet-liikenteen määrää HTTP-protokollassa RFC 3229 :n mukaisesti .

Toteutusesimerkkejä

Seuraava C - koodi toteuttaa yksinkertaisen delta-koodauksen ja dekoodauksen:

void delta_encode ( allekirjoittamaton merkki * puskuri , int pituus ) { etumerkitön merkki viimeinen = 0 ; for ( int i = 0 ; i < pituus ; i ++ ) { unsigned char current = puskuri [ i ]; puskuri [ i ] = nykyinen - viimeinen ; viimeinen = nykyinen ; } } void delta_decode ( unsigned char * puskuri , int pituus ) { etumerkitön merkki viimeinen = 0 ; for ( int i = 0 ; i < pituus ; i ++ ) { unsigned char delta = puskuri [ i ]; puskuri [ i ] = delta + viimeinen ; viimeinen = puskuri [ i ]; } }

Dokumentointi:

Delta_encode-funktiossa: *funktio ottaa taulukon ja taulukon pituuden argumenteiksi, jos pituutta ei välitetty, taulukkoa ei käsitellä * Nykyiset muuttujat alustetaan viimeisen elementin tallentamiseksi ja viimeiset viimeisen numeron tallentamiseksi. *silmukan alustus, jossa i on laskuri. Syklissä *tallennus merkin numeroon i taulukkoon *laske ero elementin numeron i ja i-1 välillä, ensimmäinen elementti ei muutu, ja anna ero tälle elementille *muuta viimeisen arvon elementin i arvoksi ennen muutosta Delta_decode-funktiossa *muuttujan alustus viimeisen merkin tallentamiseksi *silmukan alustus, jossa i on laskuri Silmukassa: *lisäämällä tähän elementtiin edellisen elementin arvon *tallenna tämän elementin arvo

Katso myös