2011-02-05 25 views
5

Có một mẫu thiết kế tôi sử dụng một lần trong một thời gian và tôi không biết nó được gọi là gì. Có lẽ nó có một cái tên và ai đó ở đây biết điều đó?Có tên cho mẫu thiết kế "điều cần xử lý" không?

Đó là điều tôi sử dụng khi tôi muốn đi qua một cấu trúc giống cây và thực hiện một số thao tác trên tất cả các nút của nó. Nó có dạng như sau:

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

Lưu ý rằng cấu trúc không phải là cây; ví dụ, mẫu này có thể được sử dụng để làm tràn ngập trong một mảng.

Vì vậy, có tên được chấp nhận cho mẫu thiết kế này không?

+10

tìm kiếm rộng đầu tiên –

+0

Làm thế nào là "chiều rộng đầu tiên"? Bạn đã nhìn vào mã? –

+1

đúng, nó là 'nodes_to_handle.pop()' không 'nodes_to_handle.pop (0)', có nghĩa là 'nodes_to_handle' là một chồng, không phải là một hàng đợi, và do đó độ sâu đầu tiên của nó. –

Trả lời

3

Tôi nghĩ rằng những gì bạn đang đạt được là một mô hình tổng quát hơn so với độ sâu đầu tiên: danh sách biên giới. Danh sách biên giới là danh sách các phần tử được sắp xếp hoặc chưa được phân loại vẫn yêu cầu xử lý; thuật toán tiếp tục loại bỏ các phần tử và xử lý chúng cho đến khi danh sách rỗng hoặc một số tiêu chí chấm dứt khác được đáp ứng.

Ví dụ yêu thích của tôi về mẫu này là thuật toán của dijkstra. Trong Dijkstra's, danh sách biên giới là một hàng đợi ưu tiên hoặc đống, và phần tử có giá trị nhỏ nhất được bật ra khỏi heap mỗi lần lặp.

3

Điều này trông giống như thuật toán độ sâu đầu tiên theo chiều ngang. (Kể từ khi bạn bật danh sách từ cuối)

Nó có thể được thực hiện quát trong một vài cách khác nhau:

  • Sử dụng một iterator mà đi qua cây (cách ưa thích)
  • Sử dụng một hàm traversal (như của bạn) với một cuộc gọi lại (cho mã số #handle node).
    • Bên ngoài lớp nút
    • Bên trong lớp nút
  • ...

Edit: Không nhìn vào mã đúng. :)

+1

Làm thế nào là "chiều rộng đầu tiên"? Bạn đã nhìn vào mã? –

+1

Xin lỗi .. chiều sâu đầu tiên là .. Tôi giả định hai bình luận ở đâu đúng, và không nhìn quá gần mã. – Macke

+0

Bất kể việc truyền tải có được thực hiện theo chiều sâu đầu tiên hay chiều rộng đầu tiên hay không, điều làm cho điều này trở nên độc đáo là cách tôi có danh sách các nút 'nodes_to_handle' cho đến khi nó trống. Không có tên cho điều đó sao? –

Các vấn đề liên quan