Come faccio a creare ogni permutazione [chiuso]

0

Ho una lista di lettere, questa è solo una lista di esempi:

['a','b','c','d','e']

Come faccio a calcolare ogni combinazione della lista? Le lettere non possono essere ripetute, per esempio.

a,b,c,d,e
a,c,b,d,e
a,c,d,b,e
a,c,d,e,b
a,e,d,c,b
...
    
posta user103052 05.10.2013 - 02:22
fonte

1 risposta

6

La semplice risposta per Python è la libreria itertools . È tutto, hai finito.

In Ruby fa parte della classe Array.

$ irb
>> a = [1, 2, 3]
=> [1, 2, 3]
>> a.permutation.to_a
=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

Tuttavia, questa è una risposta molto noiosa e non aiuta nessuno che (nonostante il tag e io puntiamo anche ad altre lingue) sta cercando di scoprire come creare ogni permutazione di un set.

L'approccio di base a questo ti itera su ogni elemento nel set e genera le permutazioni di tutto il resto del set.

L'approccio semplice a questo è un modello di backtracking . Il metodo do() fa ciò che si vuole fare, stamparlo o calcolarlo ulteriormente.

exchange (x, y) {
    return y, x;
}
generate (n) {
    int c;
    if(n = 1) do();
    for (c = 1; c < n; c++)
        {  exchange(c,n); generate(n-1); exchange(c,n); }
}

Questo algoritmo fa 2n! di scambi.

Il metodo di heap è un semplice approccio ricorsivo. Considera quanto segue

-*-*-*-*-*-
 | | | | | 
-*-|-*-|-*-
   |   |  
---*---*---
a b c a b c
b a a c c b
c c b b a a

Inizia con abc, quindi scambia 1 e 2, quindi 1, 3, quindi 1, 2, quindi 1, 3, quindi 1, 2. Se hai 4 elementi, dopo che questa sequenza di pattern è completata scambia 1, 4 - quindi un'altra sequenza e 2, 4 e un'altra sequenza e 3, 4.

Se era 5, allora ripetevi la sequenza di 4, e poi fai 1, 5, poi 2, 5, poi 3, 5. Dovresti ottenere l'idea.

Scrivere questo in modo ricorsivo è piuttosto semplice.

generate(n) {
    int c;
    if (n == 1) { do(); return; }
    for (c = 1; c <= n; c++) {
        generate(n-1);
        exchange(n % 2 ? 1 : c, n)
    }
}

Se vuoi davvero saperne di più, The Art of Computer Programming  Il volume 4, Algoritmi combinatori , sezione 7.2.1.2 è intitolato "Generazione di tutti Permutazioni "che vanno profondamente in matematica.

    
risposta data 05.10.2013 - 03:52
fonte

Leggi altre domande sui tag