Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    79

    [C\C++] Decodifica con Huffman

    Salve, ho un dubbio algoritmico relativo alla codifica canonica di Huffman.
    Supponendo di dover codificare questo insieme di caratteri: abbccccdddddddd, utilizzando l'algoritmo di Huffman otterrei il seguente albero binario:
    codice:
                O
               / \
              d   O
                 / \
                c   O
                   / \
                  b   a
    Successivamente sfruttando le profondità delle foglie nell'albero:
    d = 1
    c = 2
    b = 3
    a = 3


    ed utilizzando l'algoritmo per generare codici canonici:
    codice:
        /* codifica canonica a 0 */
        void canonical_huff() {
            uint16_t len  = 0;
            uint32_t code = 0;
            for (auto & i : _table) {
                code <<= i._numl - len;
                i._code = code;
                len = i._numl;
                ++code;
            }
        }

    ottengo i seguenti:
    d = 0
    c = 10
    a = 110
    b = 111


    Il mio problema riguarda la decodifica, supponendo di avere a disposizione questa tabellina di codici ed una funzione che mi legga i caratteri compressi bit a bit, come posso fare per decodificare senza ricostruire l'albero?
    grazie

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    L'algoritmo crea dei suffissi unici. Ciò significa che se tu comini a leggere dall'inizio e trovi 10 sei sicuro che 10 corrisponda a c perché nessun altro codice comincia con 10. Non ho controllato tutto ma il concetto è questo.
    In sostanza parti a leggere appena trovi qualcosa che matcha hai trovato il carattere che ti serve.
    Se l'input è 010111011110 puoi direttamente dividerlo così: 0 10 111 0 111 10, non ci sono dubbi. Infatti se provi a fare match diversi partendo dall'inizio non ce la fai.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.