2010-04-03 9 views
5

mam wiele cykli (wskazane przez wartości numerycznych, na przykład 1-2-3-4 odpowiada cyklowi, 4 krawędzi, krawędź 1 jest {1:2}, krawędź 2 jest {2:3}, krawędź 3 jest {3,4}, krawędź 4 to {4,1} itd.).Algorytm zgrupowanie wszystkich cyklach razem

Mówi się, że cykl jest połączony z innym cyklem, jeśli mają one jedną i tylko jedną krawędź.

Na przykład, powiedzmy, że mam dwa cykle 1-2-3-4 i 5-6-7-8, to są dwie grupy cyklów, ponieważ te dwa cykle nie łączą się ze sobą. Jeśli mam dwa cykle: 1-2-3-4 i 3-4-5-6, to mam tylko jedną grupę cykli, ponieważ te dwa cykle mają tę samą krawędź.

Poniższy rysunek powinien być w stanie zilustrować mój punkt widzenia:

alt text http://lh5.ggpht.com/_SDci0Pf3tzU/SuBhd07xbWI/AAAAAAAAFMs/9OlMhN8uzzQ/s640/mst.jpg

R1, R2 do R7 to, co nazywam "cykl". Na powyższym rysunku jest tylko jedna grupa cykli obejmująca wszystkie R1 do R7.

Jaki jest najbardziej skuteczny sposób na znalezienie wszystkich grup cyklów?

+0

W jaki sposób podaje się dane wejściowe? Jak w twoich przykładach, czy dostałeś wykres lub coś w tym stylu? – IVlad

+0

To pytanie może lepiej pasować do matematycznego przepełnienia. –

+0

Być może powinieneś wyjaśnić, co próbujesz osiągnąć, co może dać wskazówkę dlaczego nazywasz to "cyklem" i dlaczego ma "krawędzie" i co to wszystko oznacza. – Guffa

Odpowiedz

3

Najpierw znajdź wszystkie cykle na wykresie i oznacz je na przykład jako A, B, C itd. Teraz utwórz nowy wykres, w którym każdy cykl znaleziony na wykresie zostanie przekonwertowany na pojedynczy węzeł na nowym wykresie. Połącz węzły z krawędzią nowego wykresu, jeśli odpowiadające im cykle są "połączone" na starym wykresie, używając (raczej nietypowej) definicji połączonych.

Liczba "grup cykli" to liczba connected components na nowym wykresie.

+0

@ Dzięki Mark, ale czy jest i tak, aby odzyskać wszystkie cykle wewnątrz każdej grupy cykli? – Graviton

+0

@ Mark, również I pytanie jest pytaniem o tym, jak powiedzieć, jeśli cykle są połączone, ale w odpowiedzi mówisz, że muszę dołączyć do węzłów, może być bardziej jednoznacznie o tym? – Graviton

+0

@Ngu: Zostawię część cykli wykrywania komuś innemu. Aby ustalić, czy dwa cykle są połączone, policz liczbę wspólnych krawędzi. Po wykryciu cykli możesz utworzyć nowy wykres, G '. W twoim przykładzie G 'zawierałoby 7 węzłów, po jednym dla każdego wykrytego cyklu. Nazwij te nowe węzły R1, R2, ..., R7. Jeśli dwa cykle są połączone, stwórz między nimi krawędź w G '. R1 powinien mieć krawędź do R6 i R7. R2 powinien mieć krawędź dla R3 i R7, itd ... Policzyć połączone elementy tego wykresu za pomocą dowolnego standardowego algorytmu z Wikipedii - odpowiedź brzmi 1. –

0

jestem całkiem pewny, że nie jest to najbardziej skuteczny sposób, ale to będzie moja pierwsza próba:

Pierwsza wymiana ostrza o wierzchołkach: A więc na swoim przykładzie cykli 1-2-3-4, 3-4-5-6 i 5-6-7-8, ty „potrzeba ll:

"12" => "A" 
"23" => "B" 
"34" => "C" 
"45" => "D" 
"56" => "E" 
"67" => "F" 
"78" => "G" 
"41" => "H" 
"63" => "I" 
"85" => "J" 

daje ci do (V * (V-1))/2 wierzchołki, ale w porządku - to nadal może być wystarczająco dobre dla o (v^2) algorytmu.

Następnie przedstawiają cykle jak bitfields: "1-2-3-4" staje ABCH

ABCDEFGHIJ 
1110000100 

i "3-4-5-6" staje CDEI

ABCDEFGHIJ 
0011100010 

Tak mają dokładnie jeden wspólny mianownik, co oznacza, że ​​na oryginalnym wykresie mają wspólną jedną krawędź. Może to być sprawdzane krok po kroku za pomocą O (v^2) lub za pomocą wyszukiwania binarnego (pierwsze sprawdzenie za pomocą AND, jeśli mają jakiś wspólny bit, następnie sprawdź ANDING pierwszej połowy bitów itd.)

+0

Nie myśl, że twoje rozwiązanie działa, a co jeśli dwa cykle, które nie łączą się bezpośrednio, czy mimo to wciąż należą do tej samej grupy cyklicznej? – Graviton

+0

@Ngu: Moim zamiarem było najpierw przetestowanie dwóch cykli i połączenie ich w jeden, jeśli są połączone (połączenie można łatwo wykonać operacją OR). Następnie przejdź do następnego cyklu. Mam nadzieję, że dobrze rozumiem grupowanie, ponieważ jest tutaj używane! –

+0

Jeśli chcesz poprawić wydajność, możesz także spróbować eksperymentować z testowaniem trzech lub czterech cykli jednocześnie, wykonując ORAZ (w zależności od prawdopodobieństwa, że ​​cykle znajdują się w jednej grupie, możesz poprawić wydajność w ten sposób). Następnie "drążyć" tylko do par cykli, jeśli wystąpiło dopasowanie. Może być nawet możliwe rozpoczęcie od AND i połowy cykli i "wiercenie" w dół rekursywnie ... –

Powiązane problemy