Dfs BFS là gì

Chúng ta đã biết về BFS thực sự là gì? nếu không thì không cần phải cảm thấy tồi tệ, chỉ cần đọc toàn bộ bài viết và truy cập bài viết trước của chúng tôi trên Tìm kiếm đầu tiên theo chiều rộng để hiểu rõ hơn. BFS là một trình duyệt theo thứ tự cấp trong đó chúng ta truy cập các nút của cây nhị phân từ trái sang phải ở mọi cấp.

Bằng cách sử dụng một Cấu trúc dữ liệu hàng đợi, chúng tôi tìm thấy trình tự cấp. Chúng tôi bắt đầu từ root sau đó chúng tôi chèn root vào BFS và chèn tất cả các hàng xóm của nút đó vào hàng đợi. Sau đó, bật nút khỏi hàng đợi và thêm nó vào BFS nếu nó không được truy cập và thêm tất cả những người hàng xóm [không được truy cập] vào hàng đợi. Lặp lại nó cho đến khi kích thước của hàng đợi không bằng null.

Tìm kiếm đầu tiên theo chiều sâu [DFS]

Chúng ta cũng biết DFS thực sự là gì? Bạn có thể truy cập bài viết trước của chúng tôi trên Tìm kiếm sâu đầu tiên. DFS của một BT là ba loại truyền tải:

  1. Đặt hàng trước Traversal
  2. Inorder Traversal
  3. Truyền tải đơn đặt hàng

Đặt hàng trước Traversal

Algorithm: Preorder[root]: Step:1 Print the data of the Node. Step:2 Move to the left side of the node[traverse left-subtree]. Step:3 Move to the right side of the node[traverse right-subtree].

Inorder Traversal

Algorithm:  Inorder[root]: Step:1 Move to the left side of the node[traverse left-subtree]. Step:2 Print the data of the Node.  Step:3 Move to the right side of the node[traverse right-subtree].

Truyền tải đơn đặt hàng

Algorithm: Postorder[root]: Step:1 Move to the left side of the node[traverse left-subtree]. Step:2 Move to the right side of the node[traverse right-subtree]. Step:3 Print the data of the Node.

Dsự khác biệt giữa BFS và DFS của cây nhị phân

Loại cấu trúc dữ liệu được sử dụng

Trong BFS, chúng tôi sử dụng hàng đợi loại cấu trúc dữ liệu và trong DFS, chúng tôi sử dụng ngăn xếp kiểu cấu trúc dữ liệu.

Không gian phức tạp

Trong BFS, chúng tôi sử dụng một hàng đợi để lưu trữ các phần tử của mức để không gian tối đa được sử dụng trong BFS là O [w] trong đó w là phần tử lớn nhất trong một cấp. Trong DFS, chúng tôi sử dụng ngăn xếp và tuân theo khái niệm chiều sâu. Vì vậy, chiều cao tối đa của cây đang chiếm không gian tối đa để đánh giá. Vì vậy, độ phức tạp không gian của DFS là OH] với H là chiều cao của cây.

Thời gian phức tạp

Hiện độ phức tạp của cả hai trường hợp sẽ là O [N + E] trong đó N biểu thị tổng số nút trong BT và E biểu thị tổng số cạnh trong BT.

Tìm kiếm một nút gần nhất với nút gốc

Để có được kết quả tốt nhất, chúng tôi sử dụng BFS để tìm kiếm loại nút gần nút gốc nhất vì nó tuân theo trình tự cấp.

Tìm kiếm một nút từ nút gốc

Để có được kết quả tốt nhất, chúng tôi sử dụng DFS trong trường hợp này vì nó tuân theo khái niệm chiều sâu.

Ý nghĩa

BFS nghĩa là tìm kiếm theo chiều rộng và DFS nghĩa là tìm kiếm theo chiều sâu.

Loại cấu trúc dữ liệu được sử dụng

BFS sử dụng cấu trúc dữ liệu kiểu Hàng đợi và DFS sử dụng cấu trúc dữ liệu kiểu Ngăn xếp.

Căn bản

BFS là một thuật toán dựa trên đỉnh và DFS là một thuật toán dựa trên cạnh.

Tốc độ

BFS chậm hơn DFS.

Tài liệu tham khảo

Các câu hỏi phỏng vấn

Thuật toán tìm kiếm theo chiều sâu

Tìm kiếm ưu tiên chiều sâu bắt đầu thăm đỉnh A, đi theo cạnh trái, tiếp tục tìm kiếm xong ở cây con trái mới chuyển sang tìm kiếm ở cây con phải. Thứ tự thăm viếng các đỉnh là: A, B, D, F, E, C, G.

Quá trình viếng thăm các đỉnh diễn ra như sau: Sau khi thăm đỉnh A, vì B chưa được thăm nên theo cạnh AB ta thăm B, tiếp tục theo cạnh BD tới viếng thăm D. Từ D không thể tiếp tục đi xa hơn, ta quay lại B. Từ B, theo BF đến thăm F, tiếp tục theo cạnh FE đến thăm E. Từ E cũng không thể đi xa hơn, quay lại A, duyệt tiếp đến C, G.

Kết quả của thuật toánSửa đổi

Một cách tự nhiên, kết quả của giải thuật tìm kiếm theo chiều sâu là một cây phủ qua tất cả các đỉnh được duyệt của đồ thị.

Duyệt các đỉnhSửa đổi

Có thể dùng giải thuật này để tạo một danh sách tuyến tính các đỉnh của một đồ thị [hoặc cây]. Có ba cách hiện thực phương pháp này:

  • Duyệt tiền thứ tự [preordering]: tạo ra một danh sách mà trong đó các đỉnh xuất hiện theo đúng trật tự nó được thăm đến khi chạy thuật toán. Đây chính là biểu diễn tự nhiên của quá trình thực hiện giải thuật tìm kiếm theo chiều sâu. Một biểu thức ở dạng tiền thứ tự được gọi là ký pháp tiền tố.
  • Duyệt hậu thứ tự [postordering]: tạo ra một danh sách mà trong đó các đỉnh xuất hiện theo thứ tự của lần duyệt đến sau cùng khi thực hiện giải thuật. Một lần duyệt hậu thứ tự một cây biểu thức sẽ cho ra một ký pháp hậu tố.
  • Duyệt đảo hậu thứ tự [reverse postordering]: kết quả của cách duyệt này là sự đảo ngược lại thứ tự trong kết quả duyệt hậu thứ tự. Thông thường, khi duyệt cây, cách này cho ra cùng kết quả với duyệt tiền thứ tự, nhưng xét tổng quát, khi duyệt một đồ thị, tiền thứ tự và đảo hậu thứ tự cho ra kết quả khác nhau. Với các đồ thị có hướng và không có vòng, cách duyệt đảo hậu thứ tự cho ra một trật tự tô-pô của đồ thị đó.

Thuật toán tìm kiếm theo chiều sâu trong đồ thị vô hướng[1]Sửa đổi

Ý tưởng thuật toánSửa đổi

  1. DFS trên đồ thị vô hướng cũng giống như khám phá mê cung với một cuộn chỉ và một thùng sơn đỏ để đánh dấu, tránh bị lạc. Trong đó mỗi đỉnh s trong đồ thị tượng trưng cho một cửa trong mê cung.
  2. Ta bắt đầu từ đỉnh s, buộc đầu cuộn chỉ vào s và đánh đấu đỉnh này "đã thăm". Sau đó ta đánh dấu s là đỉnh hiện hành u.
  3. Bây giờ, nếu ta đi theo cạnh [u,v] bất kỳ.
  4. Nếu cạnh [u,v] dẫn chúng ta đến đỉnh "đã thăm" v, ta quay trở về u.
  5. Nếu đỉnh v là đỉnh mới, ta di chuyển đến v và lăn cuộn chỉ theo. Đánh dấu v"đã thăm". Đặt v thành đỉnh hiện hành và lặp lại các bước.
  6. Cuối cùng, ta có thể đi đến một đỉnh mà tại đó tất cả các cạnh kề với nó đều dẫn chúng ta đến các đỉnh "đã thăm". Khi đó, ta sẽ quay lui bằng cách cuộn ngược cuộn chỉ và quay lại cho đến khi trở lại một đỉnh kề với một cạnh còn chưa được khám phá. Lại tiếp tục quy trình khám phá như trên.
  7. Khi chúng ta trở về s và không còn cạnh nào kề với nó chưa bị khám phá là lúc DFS dừng.

Mệnh đềSửa đổi

Gọi G là một đồ thị vô hướng, trên đó ta sẽ thực hiện thao tác DFS với đỉnh bắt đầu là s thì:

  1. Phép duyệt sẽ thăm tất cả các đỉnh cùng thành phần liên thông với s.
  2. Các cạnh có nhãn "đã thăm" sẽ tạo ra một cây tối đại của thành phần liên thông chứa s.

Chứng minhSửa đổi

  1. Khẳng định 1, là hiển nhiên vì DFS duyệt qua tất cả các đỉnh kề với đỉnh hiện hành [có thể chứng minh hoàn chỉnh hơn bằng phản chứng].
  2. Khẳng định 2, đúng do ta chỉ đánh dấu các cạnh đi đến một đỉnh mới nên không thể tạo ra chu trình. Như vậy DFS tạo ra một cây. Hơn nữa, DFS thăm tất cả các đỉnh thuộc thành phần liên thông nên cây này là cây tối đại.

Độ phức tạp của thuật toánSửa đổi

  1. DFS được gọi đúng 1 lần ứng với mỗi đỉnh.
  2. Mỗi cạnh được xem xét đúng 2 lần, mỗi lần từ một đỉnh kề với nó.
  3. Với ns đỉnh và ms cạnh thuộc thành phần liên thông chứa s, một phép DFS bắt đầu tại s sẽ chạy với thời gian O[ns + ms] nếu:
  • Đồ thị được biểu diễn bằng cấu trúc dữ liệu dạng danh sách kề.
  • Đặt nhãn cho một đỉnh là "đã thăm" và kiểm tra xem một đỉnh "đã thăm" chưa tốn chi phí O[degree].
  • Bằng cách đặt nhãn cho các đỉnh là "đã thăm", ta có thể xem xét một cách hệ thống các cạnh kề với đỉnh hiện hành nên ta sẽ không xem xét một cạnh quá 1 lần.

Xác định đỉnh kề trong DFSSửa đổi

  • Kết quả của DFS phụ thuộc vào cách ta chọn đỉnh kế tiếp.

Xác định đỉnh kề trong Depth-first search

  • Nếu ta bắt đầu tại A và thử cạnh nối đến F, sau đó đến B, rồi đến E, C, cuối cùng là G ta được:

Bắt đầu từ A và kết thúc tại G

  • Nếu cũng bắt đầu từ A nhưng đi theo trình tự, tập các cạnh đã thăm, backedge và các điểm đệ quy sẽ khác trước.

Bắt đầu từ A nhưng đi theo trình tự tập các cạnh đã thăm.

Chạy từng bước thuật toánSửa đổi

Giờ ta sẽ chạy từng bước thuật toán theo ví dụ trên.

Nguyên lý[2]Sửa đổi

Khởi đầu từ một đỉnh, đi theo các cung[cạnh] xa nhất có thể. Trở lại đỉnh của cạnh xa nhất, tiếp tục duyệt như trước, cho đến đỉnh cuối cùng.

Thuật toán Depth-first search

  • Bước 1:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 1

  • Bước 2:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 2

  • Bước 3:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 3

  • Bước 4:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 4

  • Bước 5:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 5

  • Bước 6:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 6

  • Bước 7:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 7

  • Bước 8:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 8

  • Bước 9:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 9

  • Bước 10:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 10

  • Bước 11:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 11

  • Bước 12:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 12

  • Bước 13:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 13

  • Bước 14:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 14

  • Bước 15:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 15

  • Bước 16:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 16

  • Bước 17:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 17

  • Bước 18:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 18

  • Bước 19:

Chạy từng bước thuật toán Depth-first search trong đồ thị vô hướng, bước 19

Ứng dụngSửa đổi

Nhiều giải thuật sử dụng tìm kiếm theo chiều sâu:

  • Xác định các thành phần liên thông của đồ thị
  • Sắp xếp tô-pô cho đồ thị
  • Xác định các thành phần liên thông mạnh của đồ thị có hướng
  • Kiểm tra một đồ thị có phải là đồ thị phẳng hay không

Xem thêmSửa đổi

Tìm kiếm theo chiều rộng

Tham khảoSửa đổi

  1. ^ Dương Anh Đức, Nhập môn Cấu Trúc Dữ Liệu và Giải Thuật, Đại Học Khoa Học Tự Nhiên TP.HCM
  2. ^ Trương Mỹ Dung, Chương 1. Các khái niệm cơ bản về đồ thị, trang 9, Đại Học Khoa Học Tự Nhiên TP.HCM

Liên kết ngoàiSửa đổi

Video demo thuật toán DFS

Wikimedia Commons có thêm hình ảnh và phương tiện truyền tải về Tìm kiếm theo chiều sâu.

Video liên quan

Chủ Đề