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ì.