2011-10-17 52 views
6

Potrzebuję algorytmów przeszukiwania drzewa dla dowolnych drzew w kolejności od pierwszego do najmniejszego stopnia i od szerokości pierwszego przejścia. Najtrudniejszą częścią jest to, że muszę mieć możliwość uruchomienia z dowolnego węzła i kontynuować, aż do wykonania innego określonego węzła.Przechodzenie przez ogólną strukturę drzewa rozpoczynającą się od dowolnego węzła w języku C#

Teraz mogę użyć dowolnego ze zwykłych algorytmów i zignorować ruchome węzły, dopóki nie trafię do węzła początkowego i będę kontynuować aż do węzła końcowego (co obecnie robię), ale jest to brzydkie i nieefektywne.

Wszelkie sugestie, proszę.

AKTUALIZACJA: Każdy z moich węzłów ma powiązany identyfikator. W niektórych przypadkach na początku i na końcu odwołują się do węzła. W innych przypadkach dostaję dwa identyfikatory, sprawdzam, czy dany węzeł jest węzłem początkowym, czy końcowym, sprawdzając ich identyfikatory. Używam pierwszego przejścia przez głębokość, aby znaleźć węzeł początkowy. Zarówno początkowy, jak i końcowy węzeł może znajdować się w dowolnym miejscu w hierarchii. Mam nadzieję, że ktoś mógłby wymyślić pomysł na przypadek, w którym mam już odniesienia do węzła początkowego i końcowego. BTW, węzły w drzewie jest faktycznie sortowane według porządku sortowania, który rozpoczyna się od 0 dla każdego z podrzędnych węzłów węzła i tam jest węzłowi jednego korzenia

+1

Jak znaleźć węzeł początkowy w drzewie bez przechodzenia przez niego? – BrokenGlass

+0

Czy masz już * węzeł? W przeciwnym razie potrzebujesz drugiej bazy danych, aby przyspieszyć wyszukiwanie węzłów początkowych/końcowych. – harold

+0

Proszę podać strukturę drzewa. Czy zaimplementowano jakąś kolejność sortowania? W jaki sposób powiązane są węzły? –

Odpowiedz

2

Myślę, że to, co robisz, jest najbardziej wydajnym sposobem. Zwłaszcza jeśli pracujesz z dowolnymi drzewami.

Otrzymujesz dowolne drzewo i musisz znaleźć węzeł, z którego chcesz rozpocząć przemierzanie. Ponieważ nie ma żadnej hierarchii (tj .: nie jest to drzewo binarne), będziesz musiał przeskanować węzły (możesz skończyć skanując więcej niż połowę węzłów, jeśli dany węzeł jest węzłem liścia lub jeśli węzła nie ma w drzewie, będzie musiał przeszukać całe drzewo), aż znajdziesz początek węzła. Po znalezieniu węzła możesz uruchomić narzędzie DF Traversal lub BF Traversal.

Nie widzę żadnej optymalizacji, którą możesz wykonać.

0

Zamiast

Traverse(RootNode, StartNode, EndNode) 

Przełęcz węzeł początkowy jako root

Traverse(StartNode, EndNode) 

Jednakże, jeśli chcesz wrócić węzły, które nie są dziećmi węzła startowego, musisz nadal używać aktualnej metody.

0

Jeśli będziesz musiał odpowiedzieć na wiele niepowiązanych zapytań i musisz podać ścieżkę (zamiast tylko powiedzieć, że istnieje), nie możesz zrobić nic lepszego niż to, co masz teraz AFAIK.

Z drugiej strony, jeśli spodziewasz się dużej liczby zapytań dotyczących małej liczby określonych węzłów (np. Jakie są ścieżki od A do B, C, D, E, F i G?), Możesz najpierw obliczyć minimum spanning tree z tego węzła (ów) i spraw, aby Twój system BFS był bardziej wydajny.