giả sử bạn không có bất kỳ heuristic function về khoảng cách đến mục tiêu, giải pháp tốt nhất đó là hợp lệ là bi-directionalBFS:
Algorithm ý tưởng: thực hiện tìm kiếm BFS đồng thời từ nguồn và mục tiêu: [BFS cho đến độ sâu 1 ở cả hai, cho đến độ sâu 2 ở cả hai, ....].
Thuật toán sẽ kết thúc khi bạn tìm thấy v đỉnh, nằm ở cả hai mặt trước của BFS.
Hành vi thuật toán: Đỉnh v kết thúc chạy thuật toán sẽ chính xác ở giữa nguồn và đích.
Thuật toán này sẽ mang lại kết quả tốt hơn nhiều trong hầu hết các trường hợp sau đó BFS từ nguồn [giải thích tại sao nó tốt hơn BFS sau], và chắc chắn sẽ cung cấp câu trả lời, nếu có.
tại sao nó tốt hơn BFS từ nguồn?
giả định khoảng cách giữa nguồn đến đích là k
và hệ số nhánh là B
[mỗi đỉnh có B cạnh].
BFS sẽ mở: 1 + B + B^2 + ... + B^k
đỉnh.
BFS hai hướng sẽ mở: 2 + 2B + 2B^2 + 2B^3 + .. + 2B^(k/2)
đỉnh.
cho lớn B và k, thứ hai rõ ràng là tốt hơn nhiều so với lần đầu tiên.
EDIT:
Chú ý, rằng giải pháp này không yêu cầu lưu trữ toàn bộ đồ thị trong bộ nhớ, nó chỉ yêu cầu thực hiện một chức năng: successor(v)
mà trả về tất cả những người thừa kế của một đỉnh [tất cả các đỉnh bạn có thể tới, trong vòng 1 bước từ v]. Với điều này, chỉ các nút bạn mở [2 + 2B + ... + 2B^(k/2)
như được giải thích ở trên] phải được lưu trữ. Để tiết kiệm hơn nữa bộ nhớ, bạn có thể sử dụng Iterative Deepening DFS từ một hướng, thay vì BFS, nhưng nó sẽ tiêu tốn nhiều thời gian hơn.
Bạn có thể cung cấp ảnh chụp màn hình ví dụ và dữ liệu hoặc thứ gì đó cho những người không có LinkedIn không? – Zirak
Bạn đang đề cập đến khoảng cách vòng tròn lớn? http://en.wikipedia.org/wiki/Great-circle_distance –
@Zirak bạn có thể xem ví dụ của tôi, tôi đã chỉnh sửa bài đăng – JohnJohnGa