Delta-kodning

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 22. september 2014; checks kræver 9 redigeringer .

Delta - kodning er en  måde at repræsentere data som en forskel ( delta ) mellem på hinanden følgende data i stedet for selve dataene.

Måske er det enkleste eksempel at gemme byteværdier som forskelle (deltaer) mellem på hinanden følgende værdier, i modsætning til værdierne selv. Så i stedet for 2, 4, 6, 9, 7 gemmer vi 2, 2, 2, 3, −2. Dette er ikke særlig nyttigt, når det bruges alene, men det kan være nyttigt, hvis du skal yderligere komprimere disse data, som ofte har duplikerede værdier. For eksempel anvender IFF 8SVX -lydformatet denne kodning på rene lyddata, før de anvender komprimering. Kun 8-bit lydeksemplerer godt komprimeret i tilfælde af delta-kodning, og i tilfælde af 16-bit og højere samples fungerer denne metode dårligere. Derfor vælger kompressionsalgoritmer ofte kun delta-kodning, når komprimeringen er bedre med den end uden den. Ved videokomprimering kan delta-frames dog reducere billedstørrelsen betydeligt og bruges i næsten alle video-codec.

En variation af delta-kodning, der koder for forskelle mellem strengpræfikser eller suffikser , kaldes inkrementel kodning . Det er særligt effektivt til sorterede lister med små forskelle mellem strenge, såsom en liste over ord fra en ordbog .

Ved delta-kodet netværkstransmission, hvor kun en enkelt kopi af filen er tilgængelig i hver ende af kommunikationskanalen, bruges specielle fejlkorrektionskoder til at registrere, hvilke dele af filen der er ændret siden den forrige version.

Delta-kodning bruges som et indledende trin til mange kompressionsalgoritmer, såsom RLE , og i inverterede søgemaskineindekser. Karakteren af ​​de data, der skal kodes, påvirker i høj grad effektiviteten af ​​komprimeringen. Delta-kodning øger komprimeringsforholdet, når dataene har lille eller konstant variation (såsom en gradient i et billede); for data genereret af en tilfældig talgenerator med en ensartet fordeling vil komprimeringsfaktoren ikke ændre sig meget.

Delta-kodning gør det umuligt at tilfældigt få adgang til data, da det for at få adgang til et array-element er nødvendigt at summere værdierne af alle tidligere. Hvis det alligevel er nødvendigt, anvendes en blokversion af deltakodning, hvor blokke af en given længde er kodet. Så er det kun nødvendigt at summere værdierne fra begyndelsen af ​​den blok, som det nødvendige element tilhører, men ikke hele filen. Blokstørrelsen vælges afhængigt af applikationen, normalt baseret på timingresultater.

Diff-kodning

Der bør skelnes mellem delta-kodning og diff-kodning . Delta-kodning finder forskellen mellem elementer i den samme sekvens, mens diff-kodning sammenligner to forskellige datakilder, hvilket angiver forskellene mellem dem. Diff-kodning er implementeret i standard Unix utility diff , samt for at reducere mængden af ​​internettrafik i HTTP-protokollen i henhold til RFC 3229 .

Implementeringseksempler

Følgende C -kode implementerer en simpel form for in-place delta-kodning og afkodning:

void delta_encode ( usigneret char * buffer , int længde ) { usigneret tegn sidste = 0 ; for ( int i = 0 ; i < længde ; i ++ ) { usigneret char- strøm = buffer [ i ]; buffer [ i ] = nuværende - sidste ; sidste = nuværende ; } } void delta_decode ( usigneret char * buffer , int længde ) { usigneret tegn sidste = 0 ; for ( int i = 0 ; i < længde ; i ++ ) { usigneret char delta = buffer [ i ]; buffer [ i ] = delta + sidste ; sidste = buffer [ i ]; } }

Dokumentation:

I delta_encode-funktionen: *funktionen tager et array og længden af ​​arrayet som argumenter, hvis længden ikke blev passeret, så behandles arrayet ikke *De aktuelle variable initialiseres for at gemme det sidste element og sidst for at gemme det sidste tal. *loop initialisering, hvor i er en tæller. I en løkke *lagring af tegnet ved nummer i i arrayet *beregn forskellen mellem elementnummer i og i-1, det første element ændres ikke, og tildel forskellen til dette element *ændre værdien af ​​sidste til værdien af ​​element i før ændringen I delta_decode-funktionen *initialisering af en variabel for at gemme det sidste tegn *loop initialisering, hvor i er en tæller I en løkke: *tilføj værdien af ​​det forrige element til dette element *gem værdien af ​​dette element

Se også