Hogyan kell tárolni a Huffman fa verem túlcsordulás az orosz

@ Michael M, nem igazán érti, hogyan kell „torzítják” a fát, ha ez sokkal bonyolultabb, mint a példa. És ez nem nagyon világos, ami azt jelenti: „az eredeti mélység és az” egyre-nem növekszik, „”, és hogyan ezt az információt, hogy rekonstruálják a fát. Már egy kicsit több gondolat, és jött, hogyan kell tartani az összes információt a 478 byte, méretétől függetlenül a bemeneti adatokat később levelet a választ. - dzhioev december 27 '13 at 09:03







> 478 bájt, méretétől függetlenül a bemeneti adatokat később levelet> a válasz biztos, hogy írjon. Nézzük újra mindent archiváló. - uzumaxy december 27 '13 at 13:12

Kezdve mélység - a mélység a legbaloldalibb levél. Az első változás - a különbség a mélysége a második lapot, és a bal oldalon a bal oldalon. Fa egyedileg vissza. Nézzük a kezdő mélység - így elég maradt. Hozzáadása szerinti lemez az első rögzített szimbólum. Ha továbbra is „nőnek” - a „testvére” megy olyan mélyre - ha nem, adjunk hozzá egy lap ugyanazon a szinten. Stb 478. Valószínűleg már felér valami trükk egy kis maszkot Mind a 256 karakter. Valószínűleg ez lehet játszani egy terebélyes fa olyan. Mindazonáltal 478> 2 bit * 255 + 256 bájt - Michael M december 27 '13 at 13:12

Nem feltétlenül menteni egy fát. Akkor egyszerűen tárolni számlálók minden karakter a fájl elején, és visszaállítani a fa dekodingom. Esli áruház számlálók 8 byte lenne szükség 8B * 256 = 2KiB, hogy nem sok.







UPD. Sajnálom, ha 2KiB, tárolható tömörebben számlálók. Például írja be a következő formátumban a számláló: előtag + számláló. Az előtag egy három bites egész számláló mérete bájtban. példák:

  • A számláló értéke 0. tárolt 000 (3 bit).
  • Schetkik egyenlő 00111011110 222. Tárolt (11 bit).
  • Counter értéke 1024. Emlékezzünk csak 0100000010000000000 (19 bit).

Ie mérete a tárolt adatokat, hogy a számláló n egyenlő ceil (ceil (log_2 (n)) / 8) * 8 + 3 bit.

UPD2. Kitaláltam egy másik utat, ami, azt hiszem, jobb, mint az utolsó. Kezdeni írom le, hogyan végrehajtása az algoritmus építésére a fát, én fogom használni:

Ha jobban megnézed a kódot, meg tudjuk érteni, hogy annak érdekében, hogy visszaállítsa a topológia fa dostatotochno velünk a kezdő line-up a karakterek és INSERT_INDEX csomópontok az egyes lépéseket. Kiszámítjuk, hogy mennyi ideig kell egy memóriát.

Ahhoz, hogy tárolja az eredeti permutáció van szüksége 255 byte (az első / utolsó karakter nem lehet tárolni, és hogy a folyamat megszüntetése).

További megjegyzés, hogy az iterációk az algoritmus rögzített (255), és az i-edik iteráció (jobbról nulla) INSERT_INDEX rejlik az a [0, 255 - i), így tudjuk a későbbi iterációk kiosztani, hogy kevesebb bitet INSERT_INDEX tároló. Pontosabban:

Ie hraneniya beszúrni indexek szüksége 127 * 8 + 64 * 7 + 32 * 6 + 16 * 5 + 8 * 4 + 4 * 3 + 2 * 2 = 1784 bit = 223 bájt.

Összesen így kapott 255 + 223 = 478 bájt, és ez a szám nem függ a méret a bemeneti adatok, ellentétben a fent leírt módszerrel.