Với từ điển, BFS là tối ưu, nhưng thời gian chạy cần thiết tỷ lệ thuận với kích thước của nó (V + E). Với chữ cái n, từ điển có thể có ~ a^n entires, trong đó có kích thước bảng chữ cái. Nếu từ điển chứa tất cả các từ nhưng từ đó phải ở cuối chuỗi, thì bạn sẽ đi qua tất cả các từ có thể nhưng sẽ không tìm thấy bất kỳ từ nào. Đây là biểu đồ truyền tải, nhưng kích thước có thể lớn theo cấp số nhân.
Bạn có thể tự hỏi liệu có thể thực hiện nhanh hơn không - để duyệt cấu trúc "thông minh" và thực hiện nó trong thời gian đa thức. Câu trả lời là, tôi nghĩ là không.
Vấn đề:
Bạn đang đưa ra một (tuyến tính) cách nhanh chóng để kiểm tra xem một từ trong từ điển, hai chữ u, v và để kiểm tra nếu có một chuỗi u -> một -> a -> ... -> a n -> v.
là NP-hard.
Proof: Lấy một số ví dụ 3SAT, như
(p hoặc q hay không r) và (p hay không q hoặc r)
Bạn sẽ bắt đầu với 0 000 00 và là để kiểm tra xem có thể đi đến 2 222 22.
Ký tự đầu tiên sẽ là "chúng ta đã hoàn thành", ba bit tiếp theo sẽ điều khiển p, q, r và hai tiếp theo sẽ điều khiển mệnh đề.
từ phép là:
- Bất cứ điều gì mà bắt đầu với 0 và chỉ chứa 0 và 1 của
- Bất cứ điều gì mà bắt đầu với 2 và là hợp pháp. Điều này có nghĩa là nó bao gồm 0 và 1 (ngoại trừ ký tự đầu tiên là 2, tất cả các mệnh đề bit được thiết lập đúng theo bit biến, và chúng được đặt thành 1 (do đó, điều này cho thấy công thức là thỏa mãn)
- Bất cứ điều gì bắt đầu với ít nhất hai của 2 và sau đó bao gồm 0 và 1 (biểu thức chính quy: 222 * (0 + 1) *, như 22221101 nhưng không 2212001
Để sản xuất 2 222 22 từ 0 000 00, bạn phải thực hiện theo cách này:
(1) Lật các bit thích hợp - ví dụ 0 100 111 trong bốn bước. Điều này đòi hỏi phải tìm giải pháp 3SAT
(2) Thay đổi bit đầu tiên thành 2: 2 100 111. Ở đây bạn sẽ được xác minh đây thực sự là giải pháp 3SAT.
(3) Thay đổi 2 100 111 -> 2 200 111 -> 2 220 111 -> 2 222 111 -> 2 222 211 -> 2 222 221 -> 2 222 222.
Những quy định thi hành mà bạn không thể lừa (kiểm tra). Đi đến 2 222 22 chỉ có thể nếu công thức là thỏa đáng, và kiểm tra đó là NP-cứng. Tôi cảm thấy nó thậm chí có thể khó hơn (#P hoặc FNP có lẽ) nhưng NP-độ cứng là đủ cho mục đích đó tôi nghĩ.
Chỉnh sửa: Bạn có thể quan tâm đến disjoint set data structure. Điều này sẽ lấy từ điển và từ nhóm của bạn có thể được liên lạc với nhau. Bạn cũng có thể lưu trữ một đường dẫn từ mọi đỉnh đến gốc hoặc một số đỉnh khác. Điều này sẽ cho bạn một con đường, không nhất thiết là con đường ngắn nhất.
Trong ví dụ của bạn, tại sao đặt cược vào đó? Bạn đã thay đổi cùng một chữ cái hai lần liên tiếp, nó phải đọc: mèo -> bat -> bot -> bog -> dog – CaffGeek
trùng lặp http://stackoverflow.com/questions/11811918/how-to-compute-shortest- khoảng cách giữa hai từ/hai từ/11813399 # 11813399 –
Dacman, bạn có muốn chia sẻ hiệu suất của bạn được cải thiện bằng cách sử dụng chẩn đoán so với BFS không? –