2012-10-28 21 views
10

Mam następujący problem. Muszę obliczyć permutacje zestawu; jednak zestaw może zawierać dwa elementy, które są takie same i dlatego powodują powtarzające się permutacje. Na przykład:Znalezienie unikalnych permutacji sprawnie

Biorąc pod uwagę zestaw [ 0 0 1 2 ], permutacje obejmują te możliwości:

1  2  0  0 
1  2  0  0 

Jednak chciałbym, aby uniknąć identycznych permutacje, takie jak te. W programie MATLAB może po prostu to zrobić:

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

Ale tu problem jest wydajność - Robię to wielokrotnie w ogromnym for pętli i sortowania wymagane przez unique jest zbyt powolny. Moje pytanie brzmi: czy mogę obliczyć unikatowe permutacje tego rodzaju: bezpośrednio bez konieczności przechodzenia przez wynik później? Pracuję w MATLAB-ie, ale ogólne rozwiązanie prawdopodobnie byłoby pomocne, chociaż coś, co można wektoryzować w MATLAB-ie, byłoby prawdopodobnie idealne!

O ile mi wiadomo, istniejące pytania nie obejmują dokładnie tego problemu, ale przeprosiny, jeśli wcześniej udzielono na nie odpowiedzi.

+0

Jaki problem próbujesz rozwiązać? Dlaczego masz pętlę, w której musisz znaleźć permutacje różnych macierzy z dużą prędkością? – nibot

+0

Dobrze, może powinienem być bardziej konkretny, chociaż robi się trochę nieporządny. Znajduję sposoby odpowiadania zestawom obiektów między obrazami, chociaż obiekty mają przypisaną do nich klasę. Biorę 5 obiektów naraz od zbioru A i znajduję wszystkie sposoby ich dopasowania do obiektów w zbiorze B. Zajmę się ograniczeniami klasowymi, znajdując permutacje w obrębie każdej klasy. Oto dlaczego są zera: reprezentują obiekt, który nie jest sparowany z innym, dlatego nie chcę powtarzać takich permutacji. – jazzbassrob

Odpowiedz

3

Wygląda na to, że jest to regularnie występujący problem. Here to plik autorstwa Johna d'Errico (uniqueperms), który wydaje się radzić sobie z nim całkiem skutecznie. Alternatywnie, istnieje kolejne zgłoszenie FEX here autorstwa Geda Ridgwaya; będziesz musiał profilować nieco, aby zobaczyć, który z nich jest szybszy.

Zauważ, że ze względu na ograniczenia JIT Matlab, pętle nie są przyspieszane, jeśli wywołują funkcje inne niż wbudowane, więc może być korzystne skopiowanie i wklejenie zawartości tych funkcji (i/lub ich specjalizacja) wewnątrz twoja pętla (s).

+0

Ach to wszystko, dziękuję bardzo! Moje umiejętności Googling oczywiście wymagają praktyki! – jazzbassrob

Powiązane problemy