Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2010, 09:52   #1
misterx
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
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 10:16   #2
lupoxxx87
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
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 10:21   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 12:07   #4
lefantome
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
lefantome è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 13:04   #5
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Non ho capito a cosa dovrebbe servire l'albero binario?
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.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 13:11   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 14:12   #7
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da misterx Guarda i messaggi
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
Con quel tipo di codifica non servono if e neppure alberi binari. Si può fare MOLTO più velocemente.

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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 14:37   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Con quel tipo di codifica non servono if e neppure alberi binari. Si può fare MOLTO più velocemente.

Se non hai fretta pensaci sù, perché può essere molto stimolante.

Se, invece, ti serve la soluzione quanto prima, fammi sapere.
*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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 15:14   #9
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da lefantome Guarda i messaggi
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
ciao,
è 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 ?
Immagini allegate
File Type: gif untitled.gif (5.3 KB, 7 visite)

Ultima modifica di misterx : 19-04-2010 alle 15:20.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 16:17   #10
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Con quel tipo di codifica non servono if e neppure alberi binari. Si può fare MOLTO più velocemente.

Se non hai fretta pensaci sù, perché può essere molto stimolante.

Se, invece, ti serve la soluzione quanto prima, fammi sapere.
anche io ho appena letto cos'è la codifica di huffman (a dire il vero gli ho dato uno sguardo veloce)! Ma forse con una funzione ricorsiva si può fare anche abbastanza facilmente! Non mi fucilate se ho detto ca..ate
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 16:31   #11
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Con quel tipo di codifica non servono if e neppure alberi binari. Si può fare MOLTO più velocemente.

Se non hai fretta pensaci sù, perché può essere molto stimolante.

Se, invece, ti serve la soluzione quanto prima, fammi sapere.
DFA?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 16:48   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
DFA?
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 16:56   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
No, ancora più veloce
P.S.: al massimo mandagli un pvt, così non roviniamo la "suspence" di misterx che magari vuol godersi l'indagine
Circuito integrato?

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).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 16:58   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 17:24   #15
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Circuito integrato?
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 17:33   #16
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Beh, forse non così veloce, però sicuramente più pratico
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...
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 17:38   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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...
Avevo pensato anche io a un DFA e anche a altro, poi per non voler aspettare, e per non rovinare la suspence a misterx ho scritto queste idee a cdimauro ma lui ha suggerito altro...
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 19:34   #18
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da clockover Guarda i messaggi
anche io ho appena letto cos'è la codifica di huffman (a dire il vero gli ho dato uno sguardo veloce)! Ma forse con una funzione ricorsiva si può fare anche abbastanza facilmente! Non mi fucilate se ho detto ca..ate
No, con la ricorsione si perde troppo tempo.
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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.
No, c'è una soluzione O(1) durante la decodifica, a cui si aggiunge una parte di inizializzazione che è O(2 ^ lunghezza massima dei codici).
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 20:11   #19
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2010, 20:21   #20
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
No, con la ricorsione si perde troppo tempo.

No, c'è una soluzione O(1) durante la decodifica, a cui si aggiunge una parte di inizializzazione che è O(2 ^ lunghezza massima dei codici).
Con possibilità di ottimizzazione in caso di soluzione "ibrida" (coi codici più lunghi calcolati tramite albero binario di decodifica).

Mmm, provo ad abbozzare una soluzione:

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 .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Gli USA dipendono dai robot stranieri: T...
Volkswagen non ha più soldi per l...
Telescopio spaziale Hubble: la NASA cerc...
Più sottile e potente: le nuove i...
Il JPL estende la vita operativa della s...
DAZN Full è in offerta: tutta la ...
GTA 6 su PC potrebbe arrivare prima del ...
Da zero al tracciato in secondi: LibreCo...
Il regista Rian Johnson lancia a 12,99 d...
Microsoft stravolge l'app Sicurezza di W...
Mercato smartphone in caduta libera: -20...
Android 17 QPR3 Beta 3 riporta il blocco...
Le 10 offerte TOP in Amazon del weekend:...
Dyson, doppio crollo su Amazon: purifica...
Il 70% delle imprese non vede effetti de...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v