scrivere un programma che effettui la trasformata di burrows-wheeler su una stringa e ne riporti il risultato.
ecco la mia soluzione (PERL, of corse) :
usate come test vector questa stringa:
link: http://it.wikipedia.org/wiki/Trasformata_di_Burrows-Wheeler
La trasformata di Burrows-Wheeler (abbreviata con BWT) è un algoritmo usato nei programmi di compressione dati come bzip2. Èstata inventata da Michael Burrows e David Wheeler.
Quando una stringa di caratteri viene sottoposta alla BWT, nessuno di questi cambia di valore perché la trasformazione permuta soltanto l'ordine dei caratteri. Se la stringa originale contiene molte ripetizioni di certe sottostringhe, allora nella stringa trasformata troveremo diversi punti in cui lo stesso carattere si ripete tante volte. Ciò è utile per la compressione perché diventa facile comprimere una stringa in cui compaiono lunghe sequenze di caratteri tutti uguali.
ecco la mia soluzione (PERL, of corse) :
Codice:
while ($text = <>) {
chomp $text;
@text = split //,$text;
$length = length($text);
@array = ($text);
for ($j=0;$j<$length;$j++) {
for ($i=0;$i<$length;$i++) {
$string .= $text[ ($i-($j+1)) ];
}
$array[$j+1] = $string;
$string = "";
}
pop(@array);
#print "[DEBUG] @array\n";
@array = sort(@array);
#print "[DEBUG] @array\n\n";
$text = "";
for ($k=0;$k<=$#array;$k++) {
$text .= substr($array[$k],($length)-1,1);
}
print "$text\n";
}
usate come test vector questa stringa:
Codice:
stringa originale ==> TRENTATRE.TRENTINI.ANDARONO.A.TRENTO.TUTTI.E.TRENTATRE.TROTTERELLANDO
stringa trasformata ==> OIIEEAEO..LDTTNN.RRRRRRRTNTTLEAAIOEEEENTRDRTTETTTTATNNTTNNAAO....OU.T