10/02/17 21:01
Donto
Salve a tutti.
Qualche tempo fa un mio prof ci ha dato, come esercizio da fare a casa, la realizzazione di una funzione di partizione di un numero date k cifre, che fosse, in aggiunta, abbastanza efficiente da non fare affaticare la memoria nel calcolo delle varie sequenze; le partizioni di un numero, come ben saprete, sono tutte le combinazioni possibili di k cifre tali che la loro somma è uguale al numero stesso, ad esempio:
n=6
k=3
Combinazioni possibili:
{4,1,1}
{1,4,1}
{1,1,4}
{3,2,1}
{3,1,2}
{2,1,3}
{2,3,1}
{1,2,3}
{1,3,2}
{2,2,2}
Ovviamente ho già elaborato una soluzione algoritmica in C++, che è la seguente:
In cui, passando i parametri "n" ed "amici" alla funzione "genera_permutazioni", per ogni partizione di base effettuo la permutazione, generando tutte le possibili combinazioni.
Ovviamente il problema è dietro l'angolo: per numeri troppo grandi (orientativamente da 15 in su), il programma ci mette fin troppo ad eseguire le istruzioni, portandomi ad un segmentation_fault per la troppa memoria usata.
Avevo già cercato una soluzione in merito, provando l'approccio con la programmazione dinamica (non andato a buon fine) e col backtracking (valido ma sempre dispendioso in termini di memoria); alla luce delle considerazioni fatte, sapreste indicarmi una soluzione riguardante l'ottimizzazione del calcolo delle partizioni di numeri abbastanza grandi? Ci sto faticando da quasi un mese ma sembro non approdare da nessuna parte
Qualche tempo fa un mio prof ci ha dato, come esercizio da fare a casa, la realizzazione di una funzione di partizione di un numero date k cifre, che fosse, in aggiunta, abbastanza efficiente da non fare affaticare la memoria nel calcolo delle varie sequenze; le partizioni di un numero, come ben saprete, sono tutte le combinazioni possibili di k cifre tali che la loro somma è uguale al numero stesso, ad esempio:
n=6
k=3
Combinazioni possibili:
{4,1,1}
{1,4,1}
{1,1,4}
{3,2,1}
{3,1,2}
{2,1,3}
{2,3,1}
{1,2,3}
{1,3,2}
{2,2,2}
Ovviamente ho già elaborato una soluzione algoritmica in C++, che è la seguente:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int somma(vector<unsigned> p) { int s=0; for (int i=1; i<p.size(); i++) { s+=p[i]; } return s; } void genera_permutazioni(unsigned n,unsigned amici) { vector<unsigned> p(amici,1); p[0]=(n-amici+1); int tmp=0; while (true)// PEZZO DI CODICE ERRATO PER SEGMENTATION FAULT---> SI OCCUPA DI PARTIZIONARE UN INTERO { do { for (int i=0; i<amici; i++) { cout<<p[i]<<" "; } cout<<endl; }while(prev_permutation(p.begin(),p.end())); for (int i=1; i<amici; i++) { if (p[i]<p[0]-1) { tmp=i; break; } } if (tmp==0) { return; } for (int i=1; i<=tmp; i++) { p[i]=p[tmp]+1; } p[0]=(n-somma(p)); tmp=0; } } int main() { unsigned n,amici; cin>>n>>amici; genera_permutazioni(n,amici); return 0; }
In cui, passando i parametri "n" ed "amici" alla funzione "genera_permutazioni", per ogni partizione di base effettuo la permutazione, generando tutte le possibili combinazioni.
Ovviamente il problema è dietro l'angolo: per numeri troppo grandi (orientativamente da 15 in su), il programma ci mette fin troppo ad eseguire le istruzioni, portandomi ad un segmentation_fault per la troppa memoria usata.
Avevo già cercato una soluzione in merito, provando l'approccio con la programmazione dinamica (non andato a buon fine) e col backtracking (valido ma sempre dispendioso in termini di memoria); alla luce delle considerazioni fatte, sapreste indicarmi una soluzione riguardante l'ottimizzazione del calcolo delle partizioni di numeri abbastanza grandi? Ci sto faticando da quasi un mese ma sembro non approdare da nessuna parte
aaa