A tömörítés információ nem válik

Minden nap különböző archiváló: ZIP, RAR, ACE körülöttünk.
Grafikus és audió fájlokat is tartalmazhat tömörített adatokat. Ha kell használni
kompressziós saját prog, akkor különböző dll'ki, amelyek közül sok fizetik.
Sharevarnost - nem az egyetlen tulajdona a szoftver komponenseket, zavarja a normális
használni. Ha például tömöríteni waw vagy bmp-fájl archiváló, majd
ez ad utat jelentősen speciális módszer egy adott adattípus, azaz
eljárás során figyelembe kell venni a sajátosságait egy adott típusú adatokat. Ezért célszerű, hogy képes megvalósítani a saját tömörítés.
Ebben a cikkben megmutatom, hogyan kell tömöríteni az összes információt, és megvizsgálja az egyik tömörítési eljárások.

Osztályozása tömörítési módszerek

Először is, sem a tömörítési eljárás nem nyomja semmilyen adatot a kódolási
egyértelműnek kell lennie. A kihívás az, hogy létrejöjjön a kódolási szabályt, amely
A leggyakoribb jelentések felelne meg üzenetét hosszasan. Ezért bármilyen tömörítési eljárás alapján kell semmilyen feltételezések
valószínűségi szerkezetét tömörített adatok. Például a szöveg egy adott nyelven ismert
betűk gyakorisága. A leggyakrabban használt feltételezés, hogy több
valószínű, hogy a jelentés megfelel az azonos karakterlánc. Például a szövegben ennek
Cikk a „tömörítés” a leggyakoribb. Ha semmit sem tud a valószínűségi szerkezetét
tömörített adatokat és kezeli az összes üzenetet az azonos hosszúságú egyformán valószínű, akkor nem csinál semmit
tömöríteni.

Tömörítési módszerek vannak osztva statisztikai és szókincs. A szótár módszerek, amelyek
abban az esetben, részstringjének a találkozó, amely már találtak előtt, hogy kódolja a link, hogy
Tart kevesebb helyet foglal, mint a tényleges részkarakterláncként. A klasszikus módszer a szókincs
Lempel-Ziv (LZ). Minden eddig használt módszerek csak szótár
módosításokat LZ.

Az entrópia kódolás kódolni minden karakter, de
változtatható hosszúságú kódok. Egy példa az ilyen módszerek a Huffman módszer
(Huffman). Általában szótár és statisztikai módszerekkel kombinálják, hiszen mindegyiknek megvan a saját
előnyeit.

Megjegyezzük egy dolog, amely valamilyen okból nem egyértelmű valami „elmélet”.
kódolási szabály határozza valószínűségi adatszerkezet, ami azt jelenti, hogy a kicsomagoló
Azt kell, mielőtt az elején a dekódoló már tudja. Ha megkapjuk azt a konkrét statisztikai
üzenete (például jobban tömöríthető), akkor át kell mennie, közvetlenül vagy közvetve, együtt a tömörített
üzenetet, és nem világos, hogy a teljes méretét.

Bebizonyosodott, hogy a lehető legkisebb átlagos tömörített üzenet mérete megegyezik az entrópia
együttese a lehetséges üzeneteket kerekítve meghaladja. Az entrópia a következőképpen számítjuk ki:

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

ahol Sum - összege i, p [i] - a valószínűsége, hogy a i-edik üzenetet, log - alapú logaritmusa 2.
Az entrópia egy komplex üzenet az összege entropies alkotó egyszerű üzeneteket.

Ha kódolni minden karaktert külön, a hossza az egyes üzenet kódot kell
egyenlő -log (p). Ie Például, ha a valószínűsége, hogy a szimbólum 0,3, a kód hosszúságúnak kell lennie
1,73 bit egy időben, mint a tényleges hossza az egész. Akkor az eredmények javítása, ha nem csökkentik
feladata, hogy kódolják az egyes karaktereket.

Ez a módszer alapvetően eltér az összes módszert korábban tárgyalt. fő
A előny érhető el, hogy az elméleti határ a tömörítés. Tekintsük ezt a módszert részletesen. A teljes üzenet képviseli egyetlen szám a következő módon. számot kell
tartományban 0-ról 1 Ez az intervallum részekre van osztva, amelyek arányosak a valószínűségek
Az első karakter értékeket. Kiválasztott része, amely megfelel a karakter, és részekre van osztva
valószínű értéke a második szimbólum, stb

novaya_nizhnyaya_granitsa nizhnyaya_granitsa + = szélesség * S [i]
novaya_shirina = szélesség * p [i]

ahol p [i] - annak a valószínűsége, az i-edik szimbólum, S [i] - az összege a valószínűségek a szimbólumokra indexek
kevésbé i.

Feldolgozása után minden üzenete az algoritmus csak rögzítésére
száma a kapott intervallum. A szükséges bitek száma rögzíteni ezt a számot,
megközelítőleg egyenlő mínusz a logaritmusát a horony szélességét. A rés szélessége megegyezik a termék
szimbólum valószínűségek, azaz a valószínűsége, hogy a teljes üzenetet. így kód hossza
-log (p), azaz az elméleti határ. A gyakorlatban fogunk dolgozni a változók korlátozott hosszúságú,
és a számítások pontosságának korlátozott lesz, ami azt jelenti, hogy a kompresszió még mindig egy kicsit rosszabb.

A projekt kapcsolódik a cikkhez, összeállított Visual Studio .NET.
Ez végrehajtásának aritmetikai kódolást, fájlok tömörítése, kezeli a bájtokat karaktereket.
fájl tartalmát kezelik Markov folyamat az 1. rend, azaz a. e. eloszlása
karakterek függ a valószínűsége az előző karaktert. Class CMarkovProcessDef folyamatok
tárolt adatok az erőforrás egy speciális formátumban. Ezek az adatok jönnek létre eredményeként
feldolgozás nagy mennyiségű szöveget, azaz a. e. a szöveges fájlokat, valószínűleg lesz tömörítve
is, és ha próbálja szorítani néhány bináris, a méret a „sűrített” fájl nagyobb lesz
forrást. Annak érdekében, hogy a tömörítési eljárást az adatok típusát, az adatokat ki kell cserélni a
szimbólum valószínűségek. Ezen túlmenően, a szimbólum - nem feltétlenül egy byte tömörítetlen adatot. Például,
ha van egy oszlop a táblázat, ahol az értékek egyedinek kell lennie, minden értékét -,
szimbólum, és miután a karaktert találunk, akkor visszaállíthatja nullára valószínűsége. Az alsó határ az a szélessége a intervallum tároljuk egész változók dwBuf1 és dwBuf2.
Ha a feldolgozás után a következő szimbólum felső bájt határok egyenlő
(Megjegyzendő, hogy ez nem ugyanaz a dolog, hogy ha a felső byte-szélessége nulla), akkor
megfelelő byte a végeredmény egyenlő lesz ezt az értéket, és ez lehet a
írni egy fájlt. Írja meg és mozgassa a pufferek 1 byte. Kicsomagolásakor kivéve változók kezelése ugyanaz, mint a csomagolás, mi
Kellene egy, ahol nem lesz információ a fájlból. Annak érdekében, hogy meghatározzák a következő karaktert, meg kell
megtalálják a szimbólum a legkisebb számú olyan, hogy S [n] * dwBuf2> = dwBuf3, azaz P [n]> = dwBuf3 / dwBuf2. Amikor dolgozik egész, van egy probléma: mi képviseljük a valószínűsége (tört
szám 0-tól 1) egész változó (0x100000000 * p). Szorzás és osztás van szükségük
specifikus eljárások: megszorozzuk venni régebbi 32 bites szó 64-bites eredményt, és a hasadási
ossza száma szorozva 2 ^ 32. A fordító nem umnozhitv DWORD a DWORD, tegye az eredmény
64 bites változó - a hiánya a C ++ nyelven. Úgyhogy kellett írni a különleges eljárások
szerelő.

érvényteleníti CArithmCompressorDlg :: OnBnClickedCompress ()
CFileDialog dlg1 (TRUE);
if (dlg1.DoModal () = IDOK!) visszatérés;
CFileDialog dlg2 (HAMIS «sűrített» 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, «* .compressed | * .compressed | Minden fájl | * ||.»);
if (dlg2.DoModal () = IDOK!) visszatérés;

CFile fájl1 (dlg1.GetPathName (), CFile :: modeRead);
CFile fájl2 (dlg2.GetPathName (), CFile :: modeCreate | CFile :: modeWrite);

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

file2.Write (# 038; FS, 8); // Írja be a mérete az eredeti fájl

// m_mpd - egy objektum osztály CMarkovProcessDef
m_mpd.ResetProcess (); // visszaállítása Az adatok az előző karakter

// Ez a tömörítés kezdődik
// Kezdés intervallum - re 0x00000000 0xFFFFFFFF
DWORD dwBuf1 = 0; // alsó korlát
DWORD dwBuf2 = 0xFFFFFFFF; // szélesség
DWORD DWW; // Ideiglenes változó

míg a (file1.Read (# 038; b, 1))
// számolja az új intervallum
ha (b> 0) DWW = MulHigh (m_mpd.GetDistribution (b-1), dwBuf2); mást DWW = 0;
/ *
m_mpd.GetDistribution (b-1) - Ez az S [b], egy m ..
p [b] - ez m_mpd.GetDistribution (b) - m_mpd.GetDistribution (b-1)

Cserélje ezt a funkciót annak végrehajtásáról, és kap egy tömörítési eljárás az adatok típusát.
* /
dwBuf1 + = DWW;
ha (b = 0; j-) amennyiben (file1.Read (((LPBYTE) # 038; dwBuf3) + j, 1) == 0) ((LPBYTE) # 038; dwBuf3) [j] = 0xFF;

// Search felező módszer
csinál
m = (l + h) / 2;
ha (h 0) DWW = MulHigh (m_mpd.GetDistribution (m-1), dwBuf2); mást DWW = 0;
dwBuf1 + = DWW;
dwBuf3 - = DWW;
ha (m

Itt található az ezt a cikket egy ismerősének: