Come discriminare da due nodi con frequenze identiche nell'albero di Huffman?

4

Ancora alla mia ricerca di comprimere / decomprimere i file con un'implementazione Java del codice di Huffman ( link ) per un incarico scolastico .

Dalla pagina di Wikipedia, cito:

  • Create a leaf node for each symbol and add it to the priority queue.
  • While there is more than one node in the queue:
    • Remove the two nodes of highest priority (lowest probability) from the queue
    • Create a new internal node with these two nodes as children and with probability equal to the sum of the two nodes' probabilities.
    • Add the new node to the queue.
  • The remaining node is the root node and the tree is complete.

Ora enfasi:

  • Remove the two nodes of highest priority (lowest probability) from the queue
  • Create a new internal node with these two nodes as children and with probability equal to the sum of the two nodes' probabilities.

Quindi devo prendere due nodi con la frequenza più bassa. Cosa succede se ci sono più nodi con stessa bassa frequenza ? Come faccio a discriminare quale usare?

Il motivo per cui lo chiedo è perché Wikipedia ha questa immagine:

EvolevovedereseilmioalberodiHuffmaneralostesso.Hocreatounfileconilseguentecontenuto:

aaaaeeeennttmmiihhssfffouxprl

Equestoèstatoilrisultato:

Non sembra così male. Ma ci sono chiaramente alcune differenze quando più nodi hanno la stessa frequenza.

Le mie domande sono le seguenti:

  • Che cosa fa l'immagine di Wikipedia per discriminare i nodi con la stessa frequenza?
  • Il mio albero è sbagliato? (Il metodo immagine di Wikipedia è la sola e unica risposta?)

Credo ci sia un modo specifico e rigoroso per farlo, perché per il nostro incarico scolastico, i file che sono stati compressi dal mio programma dovrebbero essere in grado di essere decompressi dai programmi di altri compagni di classe - quindi deve essere un modo "standard" o "unico" per farlo. Ma sono un po 'perso con quello.

Il mio codice è piuttosto semplice. Segue letteralmente solo i passi elencati di Wikipedia. Il modo in cui il mio codice estrae i due nodi con la frequenza più bassa dalla coda è quello di iterare tutti i nodi e se il nodo corrente ha una frequenza inferiore rispetto a uno dei due "più piccoli" nodi noti finora, sostituisce quello più alto. Proprio così.

    
posta Omega 19.11.2012 - 23:56
fonte

4 risposte

2

Se il tuo compito non specifica come discriminare tra frequenze identiche, il formato di compressione è sottodescritto e generalmente non puoi aspettarti che le implementazioni indipendenti interagiscano.

Potrebbe trattarsi di una svista da parte dell'insegnante, oppure potrebbe tentare di rendere un punto memorabile di tutto ciò.

Vorrei prima provare a chiedere dei chiarimenti, ma in assenza di ulteriori input, sceglierei un metodo facile da implementare e documentare, quindi scrivere uno standard che documenti chiaramente la tua scelta (tale che i tuoi compagni di classe potrebbero prontamente usarlo per assicurarti che la loro implementazione fosse compatibile con la tua) e consegnarlo con il tuo incarico.

    
risposta data 20.11.2012 - 19:16
fonte
2

Se stai solo scrivendo i tuoi algoritmi di codifica e decodifica, non importa come distingui tra nodi con valore uguale, fintanto che ogni metà dell'operazione utilizza la stessa metodologia.

La risposta deriva dall'implementazione della coda di priorità. Quando viene aggiunto nuovamente un valore già esistente nella coda, il nuovo elemento viene considerato inferiore o superiore rispetto all'elemento esistente con lo stesso valore di priorità. Questo è ciò di cui hai bisogno per assicurarti che il tuo algoritmo sia compatibile con quelli dei tuoi compagni di classe.

    
risposta data 20.11.2012 - 10:05
fonte
1

Scegli semplicemente uno dei nodi. Devi includere informazioni su come ricostruire comunque l'albero nel file compresso.

Wikipedia dice (sulla decompressione):

Before this can take place, however, the Huffman tree must be somehow reconstructed. In the simplest case, where character frequencies are fairly predictable, the tree can be preconstructed (and even statistically adjusted on each compression cycle) and thus reused every time, at the expense of at least some measure of compression efficiency. Otherwise, the information to reconstruct the tree must be sent a priori.

    
risposta data 20.11.2012 - 00:51
fonte
0

Per la codifica di huffman, se due nodi hanno la stessa frequenza, per scopi di compressione sono identici, quindi puoi scegliere l'uno o l'altro e otterrai una compressione uguale.

Provalo: imposta il tuo programma in modo che possa essere configurato in modo da poterlo scegliere. Quindi esegui alcuni dati di test attraverso di esso e verifica se i dati compressi risultanti cambiano di dimensioni.

    
risposta data 20.11.2012 - 17:26
fonte

Leggi altre domande sui tag