A delta kódolás egy módja annak, hogy az adatokat az egymást követő adatok közötti különbségként ( delta ) ábrázoljuk, nem pedig magát az adatot.
Talán a legegyszerűbb példa a bájtértékek tárolása az egymást követő értékek közötti különbségként (deltákként), nem magukkal az értékekkel. Tehát 2, 4, 6, 9, 7 helyett 2, 2, 2, 3, −2 értékeket tárolunk. Ez önmagában nem túl hasznos, de hasznos lehet, ha tovább kell tömörítenie ezeket az adatokat, amelyek gyakran ismétlődő értékeket tartalmaznak. Például az IFF 8SVX audioformátum ezt a kódolást a tiszta hangadatokra alkalmazza, mielőtt tömörítést alkalmazna. Csak a 8 bites hangminták tömörítenek jól delta kódolás esetén, a 16 bites és magasabb minták esetében ez a módszer rosszabbul működik. Ezért a tömörítési algoritmusok gyakran csak akkor választanak delta kódolást, ha a tömörítés jobb vele, mint nélküle. A videótömörítés során azonban a delta képkockák jelentősen csökkenthetik a képkocka méretét, és szinte minden videokodekben használatosak.
A delta kódolás azon változatát, amely a karakterlánc - előtagok vagy utótagok közötti különbségeket kódolja , növekményes kódolásnak nevezzük . Különösen hatékony olyan rendezett listák esetén, amelyekben kis különbségek vannak a karakterláncok között, például egy szótárból származó szavak listája esetén .
A delta kódolású hálózati átvitel során, ahol a kommunikációs csatorna mindkét végén csak egy példány áll rendelkezésre a fájlból, speciális hibajavító kódok segítségével észlelik, hogy a fájl mely részei változtak az előző verzió óta.
A delta kódolást számos tömörítési algoritmus, például az RLE , és fordított keresőmotor-indexek előzetes lépéseként használják. A kódolandó adatok jellege nagyban befolyásolja a tömörítés hatékonyságát. A delta kódolás növeli a tömörítési arányt , ha az adatok csekély vagy állandó változást mutatnak (például színátmenet a képen); az egyenletes eloszlású véletlenszám-generátor által generált adatoknál a tömörítési tényező nem sokat fog változni.
A delta kódolás lehetetlenné teszi az adatok véletlenszerű elérését, mivel egy tömbelem eléréséhez össze kell adni az összes előző értékét. Ha mégis szükséges, akkor a delta kódolás blokkváltozatát alkalmazzuk, amelybe adott hosszúságú blokkokat kódolnak. Ezután csak az értékeket kell összegezni annak a blokknak az elejétől, amelyhez a szükséges elem tartozik, de nem a teljes fájlt. A blokk méretét az alkalmazástól függően választják ki, általában az időzítési eredmények alapján.
Különbséget kell tenni a delta kódolás és a diff kódolás között . A Delta kódolás megtalálja a különbséget az azonos sorozat elemei között, míg a diff kódolás két különböző adatforrást hasonlít össze, jelezve a köztük lévő különbségeket. A Diff kódolás a szabványos Unix diff segédprogramban van megvalósítva , valamint az RFC 3229 szerinti HTTP protokollban az internetes forgalom csökkentésére .
A következő C - kód a helyi delta kódolás és dekódolás egyszerű formáját valósítja meg:
void delta_encode ( előjel nélküli karakter * puffer , int hossz ) { előjel nélküli karakter utolsó = 0 ; for ( int i = 0 ; i < hossz ; i ++ ) { unsigned char current = puffer [ i ]; puffer [ i ] = aktuális - utolsó ; utolsó = aktuális ; } } void delta_decode ( előjel nélküli karakter * puffer , int hossz ) { előjel nélküli karakter utolsó = 0 ; for ( int i = 0 ; i < hossz ; i ++ ) { unsigned char delta = puffer [ i ]; puffer [ i ] = delta + utolsó ; utolsó = puffer [ i ]; } }Dokumentáció:
A delta_encode függvényben: *a függvény egy tömböt és a tömb hosszát veszi argumentumként, ha a hosszt nem adtuk át, akkor a tömb nem kerül feldolgozásra *Az aktuális változók az utolsó elem tárolására inicializálódnak, az utolsó pedig az utolsó szám tárolására. *hurok inicializálás, ahol i egy számláló. Egy ciklusban *a karakter tárolása az i számon a tömbben *számítsa ki az i és i-1 elemszám közötti különbséget, az első elem nem változik, és rendelje hozzá a különbséget ehhez az elemhez *módosítsa az utolsó értékét az i elem változás előtti értékére A delta_decode függvényben *változó inicializálása az utolsó karakter tárolására *hurok inicializálás, ahol i egy számláló Egy hurokban: *hozzáadva ehhez az elemhez az előző elem értékét *mentse el ennek az elemnek az értékétTömörítési módszerek | |||||||
---|---|---|---|---|---|---|---|
Elmélet |
| ||||||
Veszteségmentes |
| ||||||
Hang |
| ||||||
Képek |
| ||||||
Videó |
|
Verzióvezérlő rendszerek ( kategória ) | |
---|---|
Csak helyi | |
Kliens-szerver | |
Megosztott | |