22

Thông thường khi tôi phải đi bộ một đồ thị, tôi đã luôn luôn sử dụng tìm kiếm theo chiều sâu vì độ phức tạp của không gian thấp hơn. Tôi thực sự chưa bao giờ thấy một tình huống kêu gọi tìm kiếm rộng đầu tiên, mặc dù trải nghiệm của tôi khá hạn chế.Tìm kiếm rộng đầu tiên hữu ích cho việc gì?

Khi nào có ý nghĩa khi sử dụng tìm kiếm rộng đầu tiên?

CẬP NHẬT: Tôi cho rằng câu trả lời của mình here hiển thị trường hợp tôi đã sử dụng BFS (vì tôi nghĩ là DFS). Tôi vẫn còn tò mò muốn biết mặc dù, tại sao nó rất hữu ích trong trường hợp này.

Trả lời

10

Khi bạn muốn tiếp cận một nút bằng cách duyệt qua ít cạnh nhất có thể, tức là khi bạn muốn tìm đường đi ngắn nhất trong biểu đồ không có trọng số.

Độ phức tạp của không gian của tìm kiếm độ sâu đầu tiên có thể cao hơn độ phức tạp của tìm kiếm đầu tiên trên bề rộng khi ví dụ: mỗi nút chỉ có một nút con, tức là khi biểu đồ sâu nhưng không phải là rất rộng.

+0

Dường như nó sẽ là một trường hợp cực kỳ nghiêm trọng đối với BFS chiếm ít không gian hơn DFS, xem xét độ phức tạp của không gian của BFS là b^d. –

+0

Sau khi làm mới bản thân mình về những gì b và d thực sự có nghĩa là trong bình luận ở trên của tôi, tôi nhớ rằng mỗi nút có một nút con sẽ là 1^d. Vì vậy, tôi cho rằng chỉ có một nút con * sẽ * là một trường hợp cực đoan. :-) –

2

Một ví dụ là duyệt qua hệ thống tệp (có độ sâu đệ quy giới hạn).

Theo wikipedia, nó cũng hữu ích cho các thuật toán đồ thị nhất định (lưỡng cực, các thành phần được kết nối).

3

Có thể được sử dụng để giải quyết vấn đề tìm kiếm với số bước tối thiểu. Đi sâu vào đầu tiên có thể dẫn (nếu không bị giới hạn bằng cách nào đó) đến độ sâu vô hạn.

Ví dụ: tìm nút gần nhất với gốc đáp ứng điều kiện.

+0

Nói cách khác, BFS là giải pháp đơn giản nhất cho đồ thị vô hạn? –

+1

Không thực sự. Đó là một cách tiếp cận ngây thơ. Nếu bạn chắc chắn 100% rằng một giải pháp tồn tại thì nó có thể hoạt động. Nhưng nếu không có giải pháp tồn tại và bạn không giới hạn tìm kiếm thì đó không phải là cách tiếp cận tốt. –

1

Khi bạn cần có đường đi ngắn nhất đến đỉnh từ biểu đồ không có trọng lượng cạnh.

+0

BFS là công cụ tốt nhất cho công việc trong trường hợp đó như thế nào? Có thể không được thực hiện bằng cách sử dụng một DFS? –

+0

@ JasonBaker: hãy dùng thử đôi khi! Để tìm đường đi ngắn nhất trong biểu đồ có nhiều chu kỳ, DFS yêu cầu sổ sách kế toán đáng ngại để ngăn việc trùng lặp và cố gắng đảm bảo tiến độ. Khi BFS đạt được mục tiêu, bạn đã hoàn thành, khi DFS đạt được mục tiêu, bạn phải tiếp tục cho đến khi quá trình duyệt hoàn chỉnh được hoàn tất để đảm bảo bạn không bỏ lỡ bất kỳ điều gì. BFS truy cập mỗi nút đến mục tiêu một lần, DFS sẽ truy cập nhiều lần (một lần nữa, để hạn chế điều đó, cần phải lưu giữ sổ sách cẩn thận và các chẩn đoán cụ thể theo miền có thể rất khó để có được quyền). – Bogatyr

1

Trong tìm kiếm đầu tiên, bạn có thể tìm thấy giải pháp "cục bộ" - để tìm giải pháp toàn cầu bạn cần phải duyệt toàn bộ biểu đồ (hoặc sử dụng heuristic).

1

BFS đôi khi thực sự hữu ích. Giả sử bạn có một cây đại diện cho chúng ta hãy nói WBS. Bạn có thể muốn trình bày cho người dùng của bạn chỉ có 1 cấp độ của nó.

+1

Erm ... WBS là gì? –

+0

Cấu trúc phân tích công việc;) http://en.wikipedia.org/wiki/Work_breakdown_structure – kubal5003

6

Nếu tên miền tìm kiếm của bạn là vô hạn, tìm kiếm theo chiều sâu không đảm bảo chấm dứt/tìm giải pháp, ngay cả khi giải pháp hữu hạn tồn tại.

Ngoài ra, bạn có thể xem các thuật toán phức tạp hơn như A * để trở thành một loại phụ đặc biệt của tìm kiếm theo chiều rộng.

Nói chung, bfs vừa tối ưu vừa hoàn chỉnh (với hệ số phân nhánh hữu hạn) trong khi dfs thì không.

2

Khi nào bạn sử dụng tìm kiếm rộng đầu tiên?

Ví dụ: khi bạn cần tìm đường đi ngắn nhất trong biểu đồ - DFS không thể thực hiện điều đó. Có một số ứng dụng khác, nhưng, nói chung, DFS và BFS là cùng một thuật toán làm việc trên các cấu trúc dữ liệu khác nhau (BFS sử dụng hàng đợi và DFS làm việc với ngăn xếp).

3

Không ai đề cập đến yếu tố then chốt trong trường hợp tìm kiếm theo chiều rộng đầu tiên hữu ích: truy cập nút một cách có thể loại bỏ yêu cầu truy cập nút theo cách khác.Trong một số trường hợp, người ta sẽ thực hiện cùng một công việc bất kể thứ tự các nút được truy cập, nhưng BFS sẽ có ít hành động hơn đang chờ xử lý tại một thời điểm nhiều hơn DFS. Trong các trường hợp khác, việc truy cập các nút trong một chuỗi có thể đòi hỏi nhiều công việc hơn các nút khác; các thuật toán ngắn nhất khác nhau được đưa ra như một ví dụ về điều đó. Nếu ghé thăm một nút yêu cầu đến thăm hàng xóm của nó trừ khi nút được biết là có thể truy cập được bằng đường dẫn ngắn hơn nút hiện tại, việc truy cập các nút theo thứ tự chiều rộng đầu tiên thường sẽ dẫn đến các nút được gán đường đi ngắn nhất - hoặc một cái gì đó gần với nó - chuyến thăm đầu tiên của họ. Ngược lại, tìm kiếm theo chiều sâu sẽ khiến nhiều nút được truy cập bằng đường dẫn rất dài lần đầu tiên, sau đó bằng đường dẫn hơi ngắn hơn, đường dẫn ngắn hơn, v.v. yêu cầu tổng số công việc khổng lồ.

BTW, một minh họa đồ họa đẹp về sự khác biệt giữa thuật toán độ sâu đầu tiên và chiều rộng là vùng tràn ngập khu vực, nơi một nút màu trắng tràn ngập bằng cách sơn màu đen và lấp đầy lũ các nước láng giềng. Nếu một cố gắng lấp đầy khu vực hình vuông NxN bắt đầu từ một cornder, một hoạt động chiều sâu đầu tiên sẽ lấp đầy hình vuông trong một chuỗi xoắn ốc hoặc zig-zag, với các hoạt động NxN-1 còn lại trên ngăn xếp. Một điền đầy đủ bề rộng sẽ "đổ" ra khỏi điểm bắt đầu, và có tối đa các hoạt động O (N) đang chờ xử lý, bất kể hình dạng được lấp đầy. BTW, việc lấp đầy lũ lụt trong IBM BASICA đã làm việc theo cách đó (tôi không chắc chắn về QBASIC).

1

Thuật toán tìm kiếm theo chiều rộng đầu tiên thích ở gần nhất có thể với điểm xuất phát. Một số tình huống mà tôi có thể nghĩ đến là:

  1. Trang web mạng xã hội có thể sử dụng nó để tìm người trong khoảng cách được chỉ định .
  2. Có thể hữu ích trong mạng torrent/peer-to-peer để tìm kiếm máy tính lân cận.
  3. Hệ thống định vị GPS có thể sử dụng nó để tìm các vị trí lân cận.
Các vấn đề liên quan