Generazione di tutte le permutazioni escludendo le rotazioni cicliche
Così ho bisogno di un algoritmo per generare tutte le permutazioni di una lista di numeri esclusi rotazioni cicliche (ad esempio [1,2,3] == [2,3,1] == [3,1,2]).
Quando c'è almeno un numero univoco nella sequenza è abbastanza semplice, estrarre quel numero univoco, generare tutte le permutazioni dei numeri rimanenti (ma con una piccola modifica all'algoritmo di permutazioni "standard") e aggiungere il numero univoco in primo piano.
Per generare le permutazioni che ho trovato che è necessario modificare il codice permutazioni a:
def permutations(done, options)
permuts = []
seen = []
for each o in options
if o not in seen
seen.add(o)
permuts += permutations(done+o, options.remove(o))
return permuts
Solo utilizzando ogni numero univoco nelle opzioni significa che una volta che non si ottiene 322 due volte.
Questo algoritmo genera ancora rotazioni quando non ci sono elementi univoci, ad es. per [1,1,2,2] produrrebbe [1,1,2,2], [1,2,2,1] e [1,2,1,2] e le prime due sono rotazioni cicliche.
Quindi esiste un algoritmo efficiente che mi consenta di generare tutte le permutazioni senza dover passare in seguito per rimuovere le rotazioni cicliche?
In caso contrario, quale sarebbe il modo più efficiente per rimuovere le rotazioni cicliche?
NOTA: questo è non con Python, ma piuttosto C++.
Non è un duplicato di [generare tutte le permutazioni circolari univoche di un multiset] (http://stackoverflow.com/questions/3467914/is-there-an-algorithm-to-generate-all-unique-circular -permutations-di-un-MULTISET)?Ci sono alcune buone risposte lì. – Kalin