2012-10-28 20 views
10

Ho il seguente problema. Ho bisogno di calcolare le permutazioni di un set; tuttavia, l'insieme può contenere due elementi uguali e quindi causare permutazioni ripetute. Ad esempio:Trovare efficienze uniche in modo efficiente

Dato l'insieme [ 0 0 1 2 ], le permutazioni includono queste possibilità:

1  2  0  0 
1  2  0  0 

Tuttavia, vorrei evitare permutazioni identici come questi. In MATLAB posso semplicemente fare questo:

unique(perms([ 0 0 1 2 ]), 'rows') 

Ma il problema qui è l'efficienza - Sto facendo questo più volte in un enorme for ciclo e l'ordinamento previsto dalla unique è troppo lento. Quindi la mia domanda è: posso calcolare permutazioni uniche di questa natura direttamente senza dover ripetere il risultato? Sto lavorando in MATLAB ma solo una soluzione generale sarebbe probabilmente utile, anche se qualcosa che può essere vettorializzato in MATLAB sarebbe probabilmente l'ideale!

Per quanto posso vedere, le domande esistenti non coprono esattamente questo problema, ma ci scusiamo se prima ci è stata data una risposta.

+0

Quale problema stai veramente cercando di risolvere? Perché hai un ciclo in cui devi trovare permutazioni di array diversi ad alta velocità? – nibot

+0

Buon punto, forse avrei dovuto essere più specifico, anche se diventa un po 'complicato. Sto trovando modi di serie corrispondenti di oggetti tra le immagini, sebbene gli oggetti abbiano una classe associata a loro. Prendo 5 oggetti alla volta dall'insieme A, e trovo tutti i modi di corrisponderli agli oggetti nel set B. Affronto le restrizioni di classe trovando le permutazioni all'interno di ogni classe. Questo è il motivo per cui ci sono zeri: rappresentano un oggetto che non è associato a un altro, ed è per questo che non voglio ripetere tali permutazioni. – jazzbassrob

risposta

3

Sembra che questo sia un problema ricorrente. Here è un file di John d'Errico (uniqueperms) che sembra affrontarlo in modo abbastanza efficace. In alternativa, c'è un'altra richiesta FEX here di Ged Ridgway; dovrai profilare un po 'per vedere quale è più veloce.

Si noti che a causa delle limitazioni del JIT di Matlab, i loop non sono accelerati se chiamano funzioni non incorporate, quindi potrebbe essere utile copiare e incollare il contenuto di queste funzioni (e/o specializzarle un po ') all'interno il tuo loop (s).

+0

Ah questo è tutto, grazie mille! Le mie abilità su Google ovviamente hanno bisogno di pratica! – jazzbassrob

Problemi correlati