Bạn có nhận được DFS nếu bạn thay đổi hàng đợi thành ngăn xếp trong triển khai BFS không?


35

Đây là mã giả tiêu chuẩn cho tìm kiếm đầu tiên theo chiều rộng:

{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
  x := pop(q)
  visit(x)
  for each y reachable from x by one edge
    if not seen(y)
      push(q, y)
      seen(y) := true

Ở đây pushpopđược coi là hoạt động xếp hàng. Nhưng nếu chúng là các hoạt động ngăn xếp thì sao? Liệu thuật toán kết quả truy cập các đỉnh theo thứ tự độ sâu đầu tiên?


Nếu bạn bỏ phiếu cho nhận xét "đây là chuyện nhỏ", tôi sẽ yêu cầu bạn giải thích tại sao nó lại tầm thường. Tôi thấy vấn đề khá khó khăn.


5
Tôi đã thấy các sinh viên vật lộn với điều này, vì vậy tôi không nghĩ nó quá đơn giản. Tuy nhiên, câu trả lời nào chứa nhiều hơn "Có" hoặc "Không"? Độ chi tiết mong muốn không rõ ràng từ câu hỏi.
Raphael

2
"Có" sẽ đi kèm với một lập luận thuyết phục; "Không" sẽ đi kèm với một ví dụ mẫu. Nhưng có những câu trả lời tốt hơn là có / không một khi bạn hiểu chuyện gì đang xảy ra ...
rgrig


3
Có thể viết pseudo-code để chỉ đơn giản bằng cách thay đổi popđể một chồng hoặc một hoạt động hàng đợi, chúng tôi nhận dfs hoặc BFS. Thật dễ dàng để viết mã giả mà lần đầu tiên nó xuất hiện rằng điều này là đúng, nhưng thực tế không phải vậy. ics.uci.edu//~eppstein/161/960215.html là một tài liệu tham khảo có liên quan.
Joe

Câu trả lời:


23

Không, đây không giống như một DFS.

Hãy xem xét biểu đồ

nhập mô tả hình ảnh ở đây

Nếu bạn đẩy các nút theo thứ tự từ phải sang trái, thuật toán sẽ cung cấp cho bạn một đường ngang:

Một,B,E,C,D

trong khi một DFS sẽ mong đợi nó

Một,B,E,D,C

Θ(V+E)Ôi(V)

Tôi đồng ý, vấn đề không phải là nhỏ.


5
Điều này giả định rằng các danh sách kề có một số thứ tự cụ thể cố định. Trong toán học ít nhất, người ta xem chúng như một tập hợp và một biểu đồ có nhiều đường ngang theo chiều sâu, tùy thuộc vào cách bạn xảy ra để lặp lại các con. (Hãy tưởng tượng sử dụng băm cho trẻ em.) Theo nghĩa đó, ABECD vẫn là một thứ tự chuyên sâu. Người hỏi tự hỏi liệu có một ví dụ ngược ngay cả trong cài đặt này. (Thật vậy, đây là nơi nó bắt đầu trở nên khó khăn.)
rgrig

3
DED

1
@Arybhata: Ồ, xin lỗi, tôi không biết tại sao tôi lại cho rằng ý của bạn là các cạnh được hướng và hướng xuống dưới. Họ không bị ảnh hưởng, vì vậy bạn đã đúng: Đây là một ví dụ ngay cả đối với những gì tôi đã nói trong bình luận. (Điều này thật kỳ lạ: Tôi đã phải viết sai chính tả của bạn, vì vậy nó không bị xóa bởi SE.)
rgrig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.