Trả lời

28

BFS hai hướng hoạt động như thế nào?

Đồng thời chạy hai BFS từ cả hai đỉnh nguồn và đích, chấm dứt một khi một đỉnh chung cho cả hai lần chạy được phát hiện. Đỉnh này sẽ nằm giữa nguồn và đích.

Tại sao nó tốt hơn BFS?

BFS hai chiều sẽ mang lại kết quả tốt hơn nhiều so với BFS đơn giản trong hầu hết các trường hợp. Giả sử khoảng cách giữa nguồn và đích là k và hệ số phân nhánh là B (mỗi đỉnh có cạnh B trung bình).

  • BFS sẽ đi ngang 1 + B + B^2 + ... + B^k đỉnh.
  • BFS hai hướng sẽ đi ngang 2 + 2B^2 + ... + 2B^(k/2) đỉnh.

Đối với lớn Bk, thứ hai rõ ràng là nhanh hơn đầu tiên.


Trong trường hợp của bạn:

Để đơn giản tôi sẽ giả định rằng không có trở ngại trong ma trận. Đây là những gì sẽ xảy ra:

iteration 0 (init): 
front1 = { (0,5) } 
front2 = { (4,1) } 

iteration 1: 
front1 = { (0,4), (1,5) } 
front2 = { (4,0), (4,2), (3,1), (5,1) } 

iteration 2: 
front1 = { (0,3), (1,4), (2,5) } 
front2 = { (3,0), (5,0), (4,3), (5,2), (3,2), (2,1) } 

iteration 3: 
front1 = { (0,2), (1,3), (2,4), (3,5) } 
front2 = { (2,0), (4,4), (3,3), (5,3), (2,2), (1,1), } 

iteration 4: 
front1 = { (0,1), (1,2), .... } 
front2 = { (1,2) , .... } 

Bây giờ, chúng tôi đã phát hiện ra rằng mặt trận giao nhau tại (1,2), cùng với những con đường đưa đến đạt được điều đó từ nguồn và mục tiêu đỉnh:

path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) 
path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2) 

Bây giờ chúng ta chỉ cần đảo ngược đường dẫn 2 và nối nó vào đường 1 (loại bỏ một trong các đỉnh giao nhau chung), để cho chúng ta đường dẫn đầy đủ của chúng tôi:

(0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1) 
+1

Giải thích hay. Tự hỏi làm thế nào bạn sẽ lưu trữ tất cả các đường dẫn để theo dõi lại khi có một giao điểm giữa các hàng đợi? Nó sẽ mất rất nhiều không gian cho mỗi nút nếu chúng ta lưu trữ tất cả các đường dẫn. –

+0

@newbie_old [Tương tự như BFS thông thường] (http://stackoverflow.com/q/9590299/572670), mỗi nút bạn khám phá, bạn đánh dấu cách bạn khám phá ra nó. (Trong chăm sóc đặc biệt BFS hai chiều cho nút giao nhau cần có hai cha mẹ). Sau đó, bạn quay trở lại từ nút cho đến khi gốc. Yêu cầu không gian là tuyến tính trong số đỉnh, đó là không gian cần thiết cho BFS anyway (đối với tập 'truy cập' và cho hàng đợi). – amit

+0

Vì vậy, độ phức tạp thời gian được giảm theo căn bậc hai; trong khi không gian phức tạp là như nhau? – user815408