|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
[linguaggio C] decodifica di un codice prefisso
ho una certa parola che codificata mi genera i seguenti codici di lunghezza variabili:
a:1 r:0100 t:0101 n:0110 i:0111 se compongo una parola del tipo: 0100010101111010101100111 Qual'è la strategia per la sua decodifica ? Possibile che per ogni bit letto si debba usare una sorta di if(.....) oppure va usato un albero binario ? ciao |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
penso che il modo più comodo, anche se forse non il più corretto, sia sfruttare le operazioni and, or, xor e not sui bit all'interno degli if
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Beh, visto che il codice 'a' è lungo solo 1 bit mentre tutti gli altri codici ('r','t','n','i') sono lunghi 4 bit intanto devi costruirti un parser che legga una stringa di bit in input 1 bit alla volta:
- se il bit letto vale 1 prendi solo quello come token, e lo decodifichi come 'a' - se il bit letto vale 0 prendi quello più i successivi 3 come token e lo decodifichi, per esempio, con un costrutto switch-case che discrimina i codici 'r', 't', 'n' e 'i' Non ho capito a cosa dovrebbe servire l'albero binario?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 284
|
assolutamente l'albero binario.
Oltretutto sta implementando l'algoritmo di huffman . l'albero binario serve per la codifica e la decodifica. in pratica ogni codice di una parola è un path dell'albero per giungere alla foglia a cui è associato un carattere |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4908
|
Leggi un bit alla volta e lo usi per muoverti nell'albero binario.
Se arrivi ad una foglia hai trovato il carattere e puoi ripartire dalla radice. Se non puoi muoverti nella direzione in cui dovresti ed il nodo non ha un carattere associato (in questo esempio un codice che inizia con 00), hai trovato un errore.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sono andato a leggermi la codifica di Huffman, grazie della spiegazione
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Se non hai fretta pensaci sù, perché può essere molto stimolante. Se, invece, ti serve la soluzione quanto prima, fammi sapere.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
*edited*
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
è esattamente così. Il mio dubbio è che ad esempio, data la seguente sequenza o meglio, frequenza di caratteri: a:45 f:16 c:13 12:d 9:i 5:o graficando su carta, ottengo due alberi binari con profondità differenti e quindi 1 solo bit risparmiato; mi chiedo come fa l'algoritmo a non percorrere l'una anzichè l'altra strada: ma forse con la crescita bottom-up viene di conseguenza ? Ultima modifica di misterx : 19-04-2010 alle 15:20. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
DFA?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
No, ancora più veloce
P.S.: al massimo mandagli un pvt, così non roviniamo la "suspence" di misterx che magari vuol godersi l'indagine
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13054
|
Quote:
![]() Col DFA ed una matrice per le transizioni si può fare, anche se il numero di stati (almeno per come l'ho pensato io) è maggiore di 5 (dato che sono 5 le "sequenze" diverse da riconoscere). |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Più che altro è che con un DFA diventa più o meno uguale al caso dell'albero. Anzi, si trasforma in un grafo, ma la visita è analoga. :P
Ora ci rimugino su e vediamo. Mi divertono queste cose.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Beh, forse non così veloce, però sicuramente più pratico
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13054
|
Che io sappia l'automa a stati finiti per le prestazioni che offre è quanto di più semplice possa esserci.
Basta costruire una matrice di transizione e fare un ciclo, anche perché meno di O(n) non ci puoi mettere dato che devi parsare la stringa. Usando codifiche un po' più banali o cmq sfruttando la struttura stessa si potrebbe risolvere la cosa con operazioni costanti su caratteri ASCII (e non mi sembra sia questo il caso). Ma considerando che stiamo in C, non mi vengono cose più pratiche in mente...
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Con possibilità di ottimizzazione in caso di soluzione "ibrida" (coi codici più lunghi calcolati tramite albero binario di decodifica).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Anche la decodifica di Huffman si può fare senza albero, basta crearsi un vettore di struct in cui viene indicato il carattere corrispondente e l'incremento del contatore dei bit.
Ad esempio, nel caso: a:1 r:010 t:0110 n:01110 i:01111 Si può fare un vettore di 32 elementi così inizializzato: [0] => (0, 0) (condizione di errore) .... [7] => (0, 0) (condizione di errore) [8] => (r, 3) [11] => (r, 3) [12] => (t, 4) [13] => (t, 4) [14] => (n, 6) [15] => (i, 5) [16] => (a, 1) .... [31] => (a, 1) Si prendono 5 bit alla volta, ci si indicizza il vettore, si scrive il carattere e si incrementa il contatore dei bit della grandezza corrispondente. Oooopsss...mi sa che è la stessa cosa di cui parlava Cesare Ultima modifica di cionci : 19-04-2010 alle 20:21. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13054
|
Quote:
Uso un array di caratteri, in questo caso lungo 8, con indici da 0 a 7. Lo riempo in corrispondenza degli indici in binario (in 1 metto 'a'). 4 - 0100 - 'r' 5 - 0101 - 't' 6 - 0110 - 'n' 7 - 0111 - 'i' Converto la sequenza a blocchi di 4 usando la conversione binario-decimale e ricavando il carattere dall'array precedentemente riempito. In questo caso prima mi assicuro che la cifra del blocco iniziale sia diverso da 1. E' solo un abbozzo ghgh. Edit: azz ho aspettato troppo per postare (volevo elaborare il codice prima), cionci mi ha anticipato, ma vabbè ora vedo bene cosa dice lui |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:10.





















