Salve a tutti. Ho questo pezzo di codice:
codice:
void SortStrings(int *Indexes, int IndexTotal, unsigned char *String, int StringLen, int Step)
{
int *Buckets[256];
int BucketSize[256];
int BucketPos[256];
int IndexPos = 0;
if (IndexTotal < 2) return;
for(int i = 0; i < 256; i++)
BucketSize[i] = 0;
for(int i = 0; i < IndexTotal; i++)
{
int AccessPos = Indexes[i] + Step;
if (AccessPos >= StringLen)
AccessPos -= StringLen;
BucketSize[String[AccessPos]]++;
}
for(int i = 0; i < 256; i++)
{
Buckets[i] = (int*) malloc(BucketSize[i] * sizeof(int));
BucketPos[i] = 0;
}
for(int i = 0; i < IndexTotal; i++)
{
int AccessPos = Indexes[i] + Step;
if (AccessPos >= StringLen)
AccessPos -= StringLen;
Buckets[String[AccessPos]][BucketPos[String[AccessPos]]] = Indexes[i];
BucketPos[String[Indexes[i] + Step]]++;
}
for(int i = 0; i < 256; i++)
{
SortStrings(Buckets[i], BucketPos[i], String, StringLen, Step + 1);
for (int j = 0; j < BucketPos[i]; j++)
Indexes[IndexPos++] = Buckets[i][j];
}
}
Prende un array di indici all'interno di una stringa e ordina i valori interi in modo che puntino a sottostringhe (ogni sottostringa sarebbe la stringa "ruotata" di un certo numero di caratteri) lessicograficamente crescenti. Il problema ? Che arrivato ad un certo livello di ricorsione (580, per essere precisi, almeno sul mio PC) la funzione semplicemente si rifiuta di continuare. In particolare il codice incriminato è questo:
codice:
for(int i = 0; i < 256; i++)
{
SortStrings(Buckets[i], BucketPos[i], String, StringLen, Step + 1);
for (int j = 0; j < BucketPos[i]; j++)
Indexes[IndexPos++] = Buckets[i][j];
}
Arrivato al 580° livello di annidamento (ne tiene traccia la variabile Step il programma si interrompe di botto). Siccome devo fare il sorting di puntatori dentro una stringa di 250K non è che la cosa mi vada tanto a genio. Potrei ripiegare sulla versione iterativa ma è meno veloce della ricorsiva, quindi vorrei cercare di usare questa. In alternativa suggeritemi qualche altro algoritmo molto efficiente per il sorting di stringhe (ho scritto un programma per fare la Trasformata di Burrows e Wheeler e mi serve di prendere blocchi di dati abbastanza grossi per ottenere un buon ordinamento dei valori, in modo da poterci poi passare un Move To Front ed un Encoder Aritmetico).