Tìm kiếm đồ thị: Breadth-first so với height-first


78

Khi tìm kiếm biểu đồ, có hai thuật toán dễ dàng: chiều rộng đầu tiênchiều sâu trước (Thường được thực hiện bằng cách thêm tất cả các nút biểu đồ điều chỉnh vào hàng đợi (chiều rộng đầu tiên) hoặc ngăn xếp (chiều sâu trước)).

Bây giờ, có bất kỳ lợi thế của một so với nhau?

Những cái tôi có thể nghĩ ra:

  • Nếu bạn dự đoán dữ liệu của mình sẽ ở khá xa bên trong biểu đồ, trước hết có thể tìm thấy dữ liệu sớm hơn, vì bạn sẽ đi sâu vào các phần sâu hơn của biểu đồ rất nhanh.
  • Ngược lại, nếu bạn dự đoán dữ liệu của mình sẽ xuất hiện khá xa trong biểu đồ, trước hết có thể đưa ra kết quả sớm hơn.

Có bất cứ điều gì tôi đã bỏ lỡ hoặc chủ yếu là theo sở thích cá nhân?

Câu trả lời:


43

Tôi muốn trích dẫn câu trả lời từ Stack Overflow của hstoerr , giải quyết vấn đề này một cách độc đáo:

Điều đó phụ thuộc rất nhiều vào cấu trúc của cây tìm kiếm và số lượng và vị trí của các giải pháp .
Nếu bạn biết một giải pháp không xa gốc của cây, thì lần tìm kiếm đầu tiên (BFS) có thể tốt hơn. Nếu cây rất sâu và các giải pháp rất hiếm, thì tìm kiếm đầu tiên (DFS) có thể bám rễ mãi mãi, nhưng BFS có thể nhanh hơn. Nếu cây rất rộng, BFS có thể cần quá nhiều bộ nhớ, vì vậy nó có thể hoàn toàn không thực tế. Nếu các giải pháp là thường xuyên nhưng nằm sâu trong cây, BFS có thể không thực tế. Nếu cây tìm kiếm rất sâu, bạn sẽ cần phải hạn chế độ sâu tìm kiếm cho độ sâu tìm kiếm đầu tiên (DFS), dù sao (ví dụ với độ sâu lặp lại).

Nhưng đây chỉ là quy tắc của ngón tay cái; có lẽ bạn sẽ cần phải thử nghiệm.

Rafał Dowgird cũng nhận xét:

Một số thuật toán phụ thuộc vào các thuộc tính cụ thể của DFS (hoặc BFS) để hoạt động. Ví dụ, thuật toán Hopcroft và Tarjan để tìm các thành phần được kết nối 2 lợi dụng thực tế là mỗi nút đã truy cập mà DFS gặp phải nằm trên đường dẫn từ gốc đến nút hiện đang được khám phá.


5
Tôi không thể hiểu tại sao câu trả lời này có 27 câu trả lời và nó chính xác là sự hợp nhất của 2 câu trả lời khác, mà đơn giản chỉ là những suy nghĩ chung về ...
nbro

37

Một điểm quan trọng trong thế giới đa lõi của chúng ta: BFS dễ dàng song song hơn nhiều. Điều này là hợp lý trực giác (gửi chủ đề cho mỗi đứa trẻ) và có thể được chứng minh là như vậy là tốt. Vì vậy, nếu bạn có một kịch bản mà bạn có thể sử dụng song song, thì BFS là cách để đi.


8
Nếu DFS có lợi thế khác trong cài đặt đã cho, bạn có thể áp dụng BFS cho đến khi bạn sinh ra đủ các luồng và tiếp tục với DFS. Cụ thể hơn, bạn có thể thực hiện DFS và bất cứ khi nào bạn hạ xuống và không có đủ chủ đề, hãy sinh ra một chủ đề cho anh chị em tiếp theo.
Raphael

Câu trả lời này không xứng đáng với 20 upvote. Câu hỏi là về việc sử dụng chung của 2 thuật toán chứ không phải về việc sử dụng cụ thể.
nbro

31

(Tôi đã biến đây thành một wiki cộng đồng. Xin vui lòng chỉnh sửa.)

Nếu như

  • b là hệ số phân nhánh
  • d là độ sâu mà giải pháp là
  • d hh là chiều cao của cây (vì vậy, )dh

Sau đó

  • DFS mất thời gian và không gianO ( h )O(bh)O(h)
  • BFS mất thời gian và không gianO ( b d )O(bd)O(bd)
  • IDDFS mất thời gian và không gianO ( d )O(bd)O(d)

Lý do để chọn

  • DFS
    • dù sao cũng phải xem toàn cây
    • bạn biết , mức độ của câu trả lờid
    • đừng quan tâm nếu câu trả lời gần với root nhất
  • BFS
    • câu trả lời gần với gốc
    • bạn muốn câu trả lời gần với gốc nhất
    • có nhiều lõi / bộ xử lý
  • IDDFS
    • bạn muốn BFS, không có đủ bộ nhớ, nhưng hơi chậm là chấp nhận được

IDDFS = lặp đi lặp lại tìm kiếm sâu đầu tiên


1
Đây là một câu trả lời tuyệt vời. Tôi nhận thấy rằng trong khi câu hỏi hỏi về đồ thị, câu trả lời này đề cập đến cây. Cây là một biểu đồ tất nhiên, và nó có thể là từ có thể được thay thế ... nhưng về h"chiều cao của cây". Điều đó có dịch trực tiếp đến "chiều cao của đồ thị" không?
2023370

Một lý do khác để sử dụng IDDFS là, tùy thuộc vào cách bạn muốn sử dụng nó, sau mỗi lần lặp, bạn có thể có câu trả lời khả dĩ (nếu bạn đang tìm kiếm, giả sử, tối đa hoặc tối thiểu). Điều này có nghĩa là bạn có thể thoát thuật toán sớm nếu câu trả lời của bạn là "đủ tốt" hoặc bạn có thể thoát khỏi đầu vào của người dùng (như, một công cụ cờ vua sử dụng IDDFS để tìm một giải pháp tối ưu nhưng bị gián đoạn bởi một người chơi di chuyển một quân cờ).
jedd.ahyoung

Một điểm khác được thêm vào là DFS sử dụng stack trong khi BFS sử dụng hàng đợi.
Karthik Balaguru

17

Một kịch bản (ngoài việc tìm ra con đường ngắn nhất, đã được đề cập) trong đó bạn có thể phải chọn một kịch bản khác để có được một chương trình chính xác sẽ là các biểu đồ vô hạn:

Ví dụ, nếu chúng ta xem xét một cây trong đó mỗi nút có số lượng con hữu hạn, nhưng chiều cao của cây là vô hạn, DFS có thể không bao giờ tìm thấy nút mà bạn đang tìm kiếm - nó sẽ tiếp tục truy cập vào con đầu tiên của mỗi nút đó nhìn thấy, vì vậy nếu đứa trẻ bạn tìm kiếm không phải là con đầu lòng của bố mẹ nó, nó sẽ không bao giờ đến đó. BFS tuy nhiên được đảm bảo để tìm thấy nó trong thời gian hữu hạn.

Tương tự như vậy nếu chúng ta xem xét một cây trong đó mỗi nút có số lượng con vô hạn, nhưng cây có chiều cao hữu hạn, BFS có thể không chấm dứt. Nó sẽ chỉ truy cập vào con của nút gốc và nếu nút bạn đang tìm là con của một số nút khác, thì nó sẽ không đạt được. Trong trường hợp này, DFS được đảm bảo tìm thấy nó trong thời gian hữu hạn.


7
Đáng chú ý là cả hai chỉ mang lại thuật toán bán quyết định cho đồ thị vô hạn; bạn không thể quyết định trong thời gian hữu hạn rằng một phần tử không có trong cây (rõ ràng). Đối với các ứng dụng thực tế, lưu ý rằng (về mặt khái niệm) cấu trúc dữ liệu vô hạn có thể được xác định (xem đoạn 3.4)!
Raphael

15

Bề rộng đầu tiên và chiều sâu đầu tiên chắc chắn có cùng một hành vi trong trường hợp xấu nhất (nút mong muốn là nút cuối cùng được tìm thấy). Tôi nghi ngờ điều này cũng đúng với trường hợp trung bình nếu bạn không có thông tin về biểu đồ của mình.

Một phần thưởng tuyệt vời của tìm kiếm đầu tiên là nó tìm thấy những con đường ngắn nhất (theo nghĩa ít cạnh nhất) có thể có hoặc không được quan tâm.

Nếu thứ hạng nút trung bình của bạn (số lượng hàng xóm) cao so với số lượng nút (tức là đồ thị dày đặc), chiều rộng đầu tiên sẽ có hàng đợi rất lớn trong khi chiều sâu trước sẽ có các ngăn xếp nhỏ. Trong các biểu đồ thưa thớt, tình hình được đảo ngược. Do đó, nếu bộ nhớ là yếu tố giới hạn, hình dạng của biểu đồ có thể phải thông báo cho bạn lựa chọn chiến lược tìm kiếm.


Độ dài của hàng đợi trong bfs và chiều cao của ngăn xếp trong dfs phụ thuộc rất nhiều vào việc thực hiện. Nếu trong trường hợp dfs bạn luôn mở rộng toàn bộ hàng xóm trên ngăn xếp thì nó sẽ phát triển rất nhiều, đặc biệt là khi biểu đồ dày đặc. Chỉ đẩy tham chiếu cho biết nơi tiếp tục khi dfs trở về từ đệ quy tiết kiệm rất nhiều không gian.
uli

3

Tất cả những điều trên là chính xác, nhưng đáng chú ý là BFS và DFS tạo ra cây của riêng họ, dựa trên thứ tự họ sử dụng để đi qua cây. Mỗi cây trong số đó có tài sản riêng của nó có thể hữu ích trong một số loại vấn đề.

Ví dụ, tất cả các cạnh trong biểu đồ gốc không có trong cây BFS đều là các cạnh chéo; các cạnh nằm giữa hai nhánh của cây BFS. Tất cả các cạnh trong biểu đồ gốc không có trong cây DFS đều là các cạnh sau; các cạnh kết nối hai đỉnh trong một nhánh của cây DFS. Các tính chất như vậy có thể hữu ích cho các vấn đề như màu đặc biệt, vv


1

Cả cây DFS và BFS đều có các thuộc tính độc đáo riêng có thể cung cấp cho bạn nhiều thông tin hữu ích hơn về biểu đồ. Ví dụ với một DFS duy nhất, bạn có thể làm như sau:

  • Tìm cầu và điểm khớp nối (đối với đồ thị vô hướng)
  • Phát hiện chu kỳ
  • Tìm các thành phần được kết nối mạnh mẽ (thuật toán của Tarjan)

Với BFS, bạn có thể tìm thấy các đường dẫn ngắn nhất giữa nút nguồn và bất kỳ nút nào khác trong biểu đồ.

Chương Thuật toán đồ thị trong CLRS tổng hợp các thuộc tính này của DFS và BFS rất độc đáo.


-2

Tôi nghĩ sẽ rất thú vị khi viết cả hai theo cách mà chỉ bằng cách chuyển đổi một số dòng mã sẽ cung cấp cho bạn một thuật toán này hoặc thuật toán khác, do đó bạn sẽ thấy rằng dillema của bạn không mạnh như lúc đầu .

Cá nhân tôi thích cách giải thích của BFS khi làm ngập một cảnh quan: các khu vực có độ cao thấp sẽ bị ngập trước, và chỉ sau đó các khu vực có độ cao mới theo sau. Nếu bạn tưởng tượng các độ cao cảnh quan như các cô lập như chúng ta thấy trong sách địa lý, thì dễ dàng thấy rằng BFS lấp đầy tất cả các khu vực dưới cùng một isoline cùng một lúc, giống như điều này sẽ xảy ra với vật lý. Do đó, việc giải thích độ cao là khoảng cách hoặc chi phí tỷ lệ cho một ý tưởng khá trực quan về thuật toán.

Với suy nghĩ này, bạn có thể dễ dàng điều chỉnh ý tưởng đằng sau tìm kiếm đầu tiên để tìm cây bao trùm tối thiểu một cách dễ dàng, con đường ngắn nhất và nhiều thuật toán tối thiểu hóa khác.

Tôi chưa thấy bất kỳ sự giải thích trực quan nào về DFS (chỉ có tiêu chuẩn về mê cung, nhưng nó không mạnh bằng BFS và lũ lụt), vì vậy đối với tôi, dường như BFS tương quan tốt hơn với các hiện tượng vật lý như được mô tả ở trên, trong khi DFS tương quan tốt hơn với các lựa chọn dillema trên các hệ thống hợp lý (tức là người hoặc máy tính quyết định di chuyển để thực hiện trò chơi cờ vua hoặc đi ra khỏi mê cung).

Vì vậy, đối với tôi sự khác biệt giữa những lời nói dối về hiện tượng tự nhiên phù hợp nhất với mô hình lan truyền của chúng (chuyển vị) trong cuộc sống thực.


2
Chào mừng đến với trang web! Tuy nhiên, tôi không thực sự thấy cách này trả lời câu hỏi. Dường như đó là cảm xúc và trực giác chung của bạn về BFS và DFS nhưng câu hỏi không phải là hỏi về cảm xúc và trực giác: đó là hỏi về ưu điểm và nhược điểm. Câu trả lời của bạn dường như không giải quyết điều đó cả.
David Richerby

Phần liên quan nhiều nhất đến câu hỏi là về việc điều chỉnh thuật toán để tìm các cây bao trùm tối thiểu, đường đi ngắn nhất, v.v. và để nói rằng một số hiện tượng tự nhiên có thể được tái tạo bởi BFS, trong khi các cây quyết định của DFS
user5193682

1
Câu hỏi không hỏi những gì liên quan đến BFS và DFS. Đó không phải là hỏi về việc tìm cây bao trùm hoặc những con đường ngắn nhất hoặc làm thế nào để "tái tạo hiện tượng tự nhiên".
David Richerby

Nó yêu cầu lợi thế. Nếu người ta có thể mô hình hóa một hiện tượng vật lý trong khi không thể, thì đó là một lợi thế nếu bạn cần mô hình hóa hiện tượng này. Tôi nghĩ rằng bạn đang gắn bó với các khái niệm tiêu chuẩn của sách giáo khoa thuật toán khi diễn giải từ 'lợi thế', trong khi tôi thì không
user5193682
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.