Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423

    [C++] Problema con le funzioni ricorsive

    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).

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    Probabilmente e' un problema di dimensioni di stack ...

    Dovresti cercare di aumentarne le dimensioni ... ma come ... dipende dal tuo compilatore (e dal linker) ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Uso mingw32 come compilatore.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    Non lo uso ... ma presumo che ci sia un modo per indicare quanto stack può usare l'applicazione ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Comunque alla fine ho risolto in altra maniera ... Anche perchè apparentemente non esiste un modo rapido (per rapido intendo che impieghi meno di 1 secondo) per ordinare 250k stringhe di 250k elementi, ed a me serviva una cosa del genere.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.