[Generico] Da stringa a numero tramite conversione di base

alfo82
Buongiorno,

per prima cosa perdonate il mio linguaggio impropio... la matematica non è il mio forte!

Vorrei capire come è possibile trasformare una stringa alfanumerica in un numero intero; questo per poter confrontare, o meglio
ottenere un valore numerico che indica il "gap" tra due stringhe (alfanumeriche e di differente lunghezza). In rete non ho trovato molti spunti e quel poco che ho trovato non è per me di facile comprensione. Vi riporto uno stralcio della documentazione di un software che permette questo calcolo. E' in inglese ma di facile traduzione. Qualcuno è in grado di spiegarlo meglio magari facendo un ulteriore esempio?

Grazie mille,
AL

---

...uses a per-position base-conversion algorithm to convert a string into a number.
What this really means is that the string is converted to a number using the same
approach that one uses to convert a number of one base (e.g. hex - base 16) to another
(e.g. decimal - base 10). The major difference is that the base can change for each
position/index, according to what characters have actually been observed in that position
throughout the sampled series. This means that if you have a constant character in the
middle of your series, the base ends up being "1", the only possible value in a base-1
number system is 0, and so the constant character plays no part in actually calculating
the numerical value of the total.

Here is a worked example, on a small scale.

Assuming we have the following session ids:

AAAA
AAAC
ABAB
ABAD

Starting from the left-most column (MSB), we have the following observed character sets:

1: "A"
2: "A", "B"
3: "A"
4: "A", "B", "C", "D"

So, our bases are, in order (1,2,1,4).

Let's calculate the value of each id. In order to translate each character to a number,
we use its zero-based position in the sorted character set:

AAAA = 0 * (2*1*4) + 0 * (1*4) + 0 * (4) + 0 = 0
AAAC = 0 * (2*1*4) + 0 * (1*4) + 0 * (4) + 2 = 2
ABAB = 0 * (2*1*4) + 1 * (1*4) + 0 * (4) + 1 = 5
ABAD = 0 * (2*1*4) + 1 * (1*4) + 0 * (4) + 3 = 7

Risposte
TomSawyer1
La base di ogni colonna è determinata dal numero di caratteri diversi sulla stessa colonna - per due caratteri ti basta una base due e così via.
E, tenendo conto del fatto che $A=0, B=1, C=2, D=3$ , il calcolo si svolge come con qualsiasi numero, con la differenza che ogni posizione può avere una base diversa, cioè la prima colonna da sinistra ha base 1, la seconda ha base 2, la terza ha base 1, la quarta ha base 4. Quindi nel tuo esempio $ABAD = "valore"(A)*("base2"*"base3"*"base4") + "valore"(B)*("base3*base4")+"valore"(A)*("base4")+"valore"(D)*(1)=0 * (2*1*4) + 1 * (1*4) + 0 * (4) + 3 = 7$

alfo82
"TomSawyer":
La base di ogni colonna è determinata dal numero di caratteri diversi sulla stessa colonna - per due caratteri ti basta una base due e così via.
E, tenendo conto del fatto che $A=0, B=1, C=2, D=3$ , il calcolo si svolge come con qualsiasi numero, con la differenza che ogni posizione può avere una base diversa, cioè la prima colonna da sinistra ha base 1, la seconda ha base 2, la terza ha base 1, la quarta ha base 4. Quindi nel tuo esempio $ABAD = "valore"(A)*("base2"*"base3"*"base4") + "valore"(B)*("base3*base4")+"valore"(A)*("base4")+"valore"(D)*(1)=0 * (2*1*4) + 1 * (1*4) + 0 * (4) + 3 = 7$


Mmmhh ho riletto e riletto la tua risposta e penso d'aver capito. Solo una domanda: parto dal presupposto che a=0, b=1, c=2 ecc. per una "numerazione informatica"? Intendo il fatto che inizio a contare da 0.

Grazie mille per il tuo aiuto

alfo82
"TomSawyer":
La base di ogni colonna è determinata dal numero di caratteri diversi sulla stessa colonna - per due caratteri ti basta una base due e così via.
E, tenendo conto del fatto che $A=0, B=1, C=2, D=3$ , il calcolo si svolge come con qualsiasi numero, con la differenza che ogni posizione può avere una base diversa, cioè la prima colonna da sinistra ha base 1, la seconda ha base 2, la terza ha base 1, la quarta ha base 4. Quindi nel tuo esempio $ABAD = "valore"(A)*("base2"*"base3"*"base4") + "valore"(B)*("base3*base4")+"valore"(A)*("base4")+"valore"(D)*(1)=0 * (2*1*4) + 1 * (1*4) + 0 * (4) + 3 = 7$


Facendo delle prove non mi torna il ragionamento. Se invece che queste stringhe utilizzano dei caratteri in squenza ci fosse stato:

R E E E
A A A A
A A A C
A B A B
A B A D
R R R R

In questo caso la lettera R e la lettera E che valore avrebbero? Avrei una cosa del genere:

0 1 2 3 4 5 6
1 A R
2 A B E R
3 A E R
3 A B C D E R

A vale 0
B vale 1
C vale 2
D vale 3
E vale ? (2 o 1 o 5)
R vale ? (1 o 3 o 2 o 6)

Spero che la formattazione del messaggio rimanga leggibile.
Grazie

Umby2
Seguendo il ragionamento del precedente direi di sortare le lettere, quindi:

A vale 0
B vale 1
C vale 2
D vale 3
E vale 4
R vale 5

e quindi:

REEE = 5 * (4*3*6) + 4 * (3*6) + 4 * (6) + 4

.. e cosi' via...

canemacchina
Posso sapere di preciso a cosa ti serve questa trasformazione da numero a stringa? Per decidere quanto siano "distanti" due stringe?

Perché se fosse così ci sono algoritmi molto più semplici che determinano la distanza tra 2 stringhe (usati anceh dai correttori automatici).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.