Giải thuật tìm kiếm theo chiều sâu là gì ?
Giải thuật tìm kiếm theo chiều sâu [Depth First Search – viết tắt là DFS], còn được gọi là giải thuật tìm kiếm ưu tiên chiều sâu, là giải thuật duyệt hoặc tìm kiếm trên một cây hoặc một đồ thị và sử dụng stack [ngăn xếp] để ghi nhớ đỉnh liền kề để bắt đầu việc tìm kiếm khi không gặp được đỉnh liền kề trong bất kỳ vòng lặp nào. Giải thuật tiếp tục cho tới khi gặp được đỉnh cần tìm hoặc tới một nút không có con. Khi đó giải thuật quay lui về đỉnh vừa mới tìm kiếm ở bước trước.
Trong hình minh họa trên, giải thuật tìm kiếm theo chiều sâu đầu tiên duyệt từ các đỉnh A tới B tới C tới D sau đó tới E, sau đó tới F và cuối cùng tới G. Giải thuật này tuân theo qui tắc sau:
Qui tắc 1: Duyệt tiếp tới đỉnh liền kề mà chưa được duyệt. Đánh dấu đỉnh mà đã được duyệt. Hiển thị đỉnh đó và đẩy vào trong một ngăn xếp [stack].
Qui tắc 2: Nếu không tìm thấy đỉnh liền kề, thì lấy một đỉnh từ trong ngăn xếp [thao tác pop up]. [Giải thuật sẽ lấy tất cả các đỉnh từ trong ngăn xếp mà không có các đỉnh liền kề nào]
Qui tắc 3: Lặp lại các qui tắc 1 và qui tắc 2 cho tới khi ngăn xếp là trống.
Bảng dưới đây minh họa các qui tắc với hình ví dụ trên:
BướcDuyệtMiêu tả1.Vì C không có bất kỳ đỉnh nào liền kề mà chưa được duyệt, chúng ta tiếp tục lấy các đỉnh từ trong ngăn xếp để tìm xem có còn bất kỳ đỉnh nào liền kề mà chưa được duyệt hay không. Trong ví dụ này là không có, và chúng ta vẫn tiếp tục cho tới khi ngăn xếp là trống.
Trên đây là phần giới thiệu và minh họa cho giải thuật tìm kiếm theo chiều sâu. Để tìm hiểu code đầy đủ của giải thuật tìm kiếm theo chiều sâu trong ngôn ngữ C, mời bạn click chuột vào chương: Tìm kiếm theo chiều sâu trong C.
Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.
Follow fanpage của team //www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền //www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.
cấu trúc dữ liệu và giải thuật, giải thuật c++, giải thuật lập trình, học thuật toán, thuật toán c++, thuật toán code c++, thuật toán depth first search, thuật toán lập trình, tìm kiếm chiều sâu 5 min readBài hôm nay chúng ta cùng tìm hiểu về thuật toán Depth First Search [Tìm kiếm theo chiều sâu]1. Kiến thức cơ bản về thuật toán DFS.
+ Depth First Search là một thuật toán duyệt hoặc tìm kiếm một phần tử trên một cấu trúc dữ liệu dạng cây hay một đồ thị.
+ Bắt đầu đi từ một đỉnh của cây, sau đó từ đỉnh đó tìm ra node đầu tiên và cứ tìm các note tiếp theo
cho đến khi không đi được nữa, thì lại quay về node trước đó và tìm sang node bên cạnh để đi tiếp.
Như vậy thứ tự đi trong hình minh họa ở trên như sau:
- Bắt đầu từ 1 => 2 => 3 => 4 => hết đường đi
- Quay lại 3 => 5 => hết đường đi
- Tiếp tục từ 3 quay lại 2 => 6 => hết đường đi
- Quay lại 2 => quay lại 1 => 7 => hết đường đi
- Tiếp tục từ 1 => 8 => 9=> 10 => hết đường đi
- Quay lại 9 => 11 => hết đường đi
- Tiếp tục 9=> quay lại 8 => 12 => hết đường đi
- Quay lại 8 => quay lại 1 => hết đường => KẾT THÚC.
– Là cấu trúc dữ liệu dạng đồ thị, hay dạng cây.
– Độ phức tạp thời gian là: O[|V| + |E|] V là số đỉnh duyệt qua và E là số cạnh duyệt qua
– Độ phức tạp không gian là O[|V|]. Số đỉnh là số phần tử cần lưu trữ vào bộ nhớ.
3 Thực hành DFS.Thực hiện được hai bước cho bài toán thực hành thuật toán depth first search.
+ Xây dựng được cấu trúc dữ liệu dạng cây, với phần tử cha là phần tử đầu tiên của cây.
+ Viết hàm tìm kiếm, duyệt các phần tử bắt đầu từ phần tử cha ở trên.
a. Áp dụng với bài toán đơn giản cho hình minh họa ở trên.
+ Node là một đối tượng chung, và mỗi node có thể trỏ đến nhiều node khác là kiểu dữ liệu như nó.
=> xây dựng node là một class, và trong nó lại lưu trữ một list các đối tượng chính nó.
xây dựng một class như sau:
Định nghĩa hàm AddChild để thêm node vào.
Viết hàm duyệt case
Xây dựng hàm tạo cây nhị phân lưu trữ dữ liệu.
Trong hàm main chúng ta chỉ việc gọi.
int main[int argc, _TCHAR* argv[]]
{
DemoDFSTree[];
return 0;
}
Ok. Như vậy là chúng ta đã có thể demo được thuật toán DFS bằng code c++ với bài toán cơ bản nhất.
b. Áp dụng vào thực tế dự án, mức độ nâng cao.
Khi áp dụng vào bài toán thực tế, thì nó không đơn giản chỉ là lưu dữ liệu thuần túy kiểu số nguyên hay số thực,
mà thuật toán sẽ được áp dụng cho các dạng dữ liệu bất kỳ, các loại đối tượng bất kỳ.
Tôi ví dụ hình minh họa như sau:
+ Bài toán đặt ra là xây dựng mô hình quản lý nhân viên 1 công ty phần mềm theo cấu trúc dạng cây như trên.