So sánh giữa BFS và DFS:
BFS tốn bộ nhớ hơn vì nó lưu lại tất cả các con ở mỗi cấp.
Tuy nhiên , tùy vào bài toán cụ thể mà BFS hay DFS sẽ “chạy” nhanh hơn
Ví dụ: Ta có 1 cây gia phả qua nhiều thế hệ của một gia tộc lớn
Nếu 1 người nào đó trong gia phả muốn tìm kiếm 1 người nào đó vẫn còn sống thì ta thấy DFS thường hoạt động nhanh hơn.Tuy nhiên, nếu người đó muốn tìm một người nào đó đã mất cách đây rất lâu thì BFS thường nhanh hơn DFS.
Nói tóm lại , cái nào tốt hơn cái nào thì còn tùy thuộc vào dữ liệu và những gì bạn đang tìm kiếm.
Code: nếu bạn nào rành C# thì sẽ thấy code rất gần với mã giả vì trong C# đã hỗ trợ kiểu dữ liệu tree, stack, queue, list(có sẵn các hàm truy vấn dữ liệu luôn)… vì vậy công việc của bạn chỉ là gọi đúng hàm đúng việc là được.
Ah còn câu thầy hỏi BFS và DFS là thuật toán hay giải thuật mình xin có vài ý kiến.
Theo mình biết vẫn chưa có định nghĩa thuật toán nào được chấp nhận cả và ít thông dụng, nhưng còn giải thuật (đặc biệt là giải thuật heurictis) thì được sử dụng rộng rãi. Để đáp ứng những yêu cầu của thuật toán đòi hỏi thời gian chạy rất lớn, hoặc các điều kiện cho thuật toán khó đáp ứng(tính xác định và tính đúng đắn). Tuy nhiên ngày nay người ta đã mở rộng 2 tiêu chuẩn này.Chẳng hạn mở rộng tính xác định thể hiện qua các giải thuật đệ quy và ngẫu nhiên.Còn tính chính xác thì người ta đã chấp nhận các cách giải ít phức tạp và cho kết quả tốt(nhưng không phải lúc nào cũng tốt).
Các cách giải chấp nhận được nhưng không hoàn toàn đáp ứng đủ các tiêu chuẩn của thuật toán được gọi là giải thuật.
Vì vậy mình nghĩ BFS và DFS là thuật toán. Vì nó thỏa 2 yêu cầu của thuật toán.Dữ liệu là có giới hạn, chẳng hạn các trạng thái của 1 ván cờ vua tuy nhiều nhưng có giới hạn vì nó giới hạn trong phạm vi bàn cờ, giới hạn số quân và giới hạn cách đi của mỗi quân cờ. Vậy là thỏa tính xác định. Tính đúng đắn thì khỏi bàn cải, chỉ cần thứ mình tìm có tồn tại trong dữ liệu chắc chắn sẽ tìm thấy, vì nó duyệt qua hết “ngóc ngách” của dữ liệu.
Nếu bạn nào có ý kiến xin góp ý thêm cho mình nha.
Trả lời câu hỏi của bạn thật
Thuật toán leo đồi, nó luôn cho ra kết quả
Về cơ bản, leo đồi dốc đứng cũng giống như leo đồi, chỉ khác ở điểm là
leo đồi dốc đứng sẽ duyệt tất cả các hướng đi có thể và chọn đi theo
trạng thái TỐT NHẤT trong số các trạng thái kế tiếp có thể có (trong
khi đó leo đồi chỉ chọn đi theo trạng thái kế tiếp đầu tiên TỐT HƠN
trạng thái hiện hành mà nó tìm thấy) nên ng ta gọi nó là thuật giải
leo đồi dốc đứng.
Mình cũng đồng ý BFS và DFS là thuật toán
So sánh BFS và DFS qua 4 điểm sau:
DFS: Chiều sâu
+ Tính hiệu quả:
- Hiệu quả khi lời giải nằm sâu trong cây tìm kiếm và có một phương án
chọn hướng đi chính xác.
- Hiệu quả của chiến lược phụ thuộc vào phương án chọn hướng đi.
- Phương án càng kém hiệu quả thì hiệu quả của chiến lược càng giảm.
- Thuận lợi khi muốn tìm chỉ một lời giải.
+ Lượng bộ nhớ sử dụng để lưu trữ các trạng thái:
- Chỉ lưu lại các trạng thái chưa xét đến.
+ Trường hợp xấu nhất:
- Vét cạn toàn bộ
+ Trường hợp tốt nhất
- Phương án chọn hướng đi tuyệt đối chính xác.
- Lời giải được xác định một cách trực tiếp.
BFS: Chiều rộng
+ Tính hiệu quả:
- Hiệu quả khi lời giải nằm gần gốc của cây tìm kiếm.
- Hiệu quả của chiến lược phụ thuộc vào độ sâu của lời giải.
- Lời giải càng xa gốc thì hiệu quả của chiến lược càng giảm.
- Thuận lợi khi muốn tìm nhiều lời giải.
+ Lượng bộ nhớ sử dụng để lưu trữ các trạng thái:
Phải lưu toàn bộ các trạng thái.
+ Trường hợp xấu nhất:
- Vét cạn toàn bộ
+ Trường hợp tốt nhất
- Vét cạn toàn bộ.