2011-02-05 18 views
5

Jest wzór, którego używam raz na jakiś czas i nie wiem, jak się nazywa. Może ma imię i ktoś o tym wie?Czy istnieje nazwa wzoru "rzeczy do zrobienia"?

Jest to coś, czego używam, gdy chcę przejść przez strukturę podobną do drzewa i wykonać pewne działanie na wszystkich jego węzłach. Wygląda to tak:

nodes_to_handle = [root_node] 
while nodes_to_handle: 
    node = nodes_to_handle.pop() 
    # handle node 
    nodes_to_handle += node.get_neighbors() 

Uwaga: struktura nie musi być drzewem; na przykład ten wzorzec może być użyty do wypełnienia powodzi w tablicy.

Czy istnieje zatem akceptowana nazwa tego wzoru projektu?

+10

Pierwsze wyszukiwanie –

+0

Jak to jest "pierwsze na szerokość"? Czy spojrzałeś na kod? –

+1

w prawo, to 'nodes_to_handle.pop()' nie 'nodes_to_handle.pop (0)', co oznacza, że ​​'nodes_to_handle' jest stosem, a nie kolejką, a zatem jego głębokością-pierwszą. –

Odpowiedz

3

Myślę, że to, w co się pakujesz, jest bardziej ogólnym schematem niż przejście z pierwszego do drugiego: lista graniczna. Lista graniczna to lista (posortowana lub nieposortowana) elementów, które wymagają przetworzenia; algorytm kontynuuje usuwanie elementów i przetwarzanie ich, dopóki lista nie jest pusta lub spełnione są inne kryteria zakończenia.

Moim ulubionym przykładem tego wzoru jest algorytm dijkstry. W Dijkstrze lista graniczna jest kolejką priorytetową lub stertą, a element o najmniejszej wartości jest wyrzucany ze sterty w każdej iteracji.

3

Wygląda to na algorytm przemiatania głębokości pierwszego .. (Od pop listy od końca)

To może być realizowane rodzajowo w kilka różnych sposobów:

  • Korzystanie iterator który przemierza drzewa (preferowany sposób)
  • Korzystanie z funkcji przejścia (jak twoje) z oddzwanianiem (dla kodu #handle node).
    • Poza klasie węzła
    • W klasie węzła
  • ...

Edit: Nie patrzeć na kod poprawnie. :)

+1

Jak to jest "pierwszeństwo"? Czy spojrzałeś na kod? –

+1

Przepraszam .. Głębokość - najpierw jest .. Założę się, że te dwa komentarze były poprawne i nie wyglądały zbyt dokładnie na kod. – Macke

+0

Bez względu na to, czy przemieszczenie jest wykonywane jako pierwsze czy szerokie, to co jest wyjątkowe, to sposób, w jaki mam listę 'nodes_to_handle', którą mam' .pop' węzłów, dopóki nie będzie pusta. Czy nie ma na to nazwy? –

Powiązane problemy