Một thuật toán truyền tải đồ thị khám phá tất cả các đỉnh trong biểu đồ ở độ sâu hiện tại trước khi chuyển sang các đỉnh ở cấp độ sâu tiếp theo.. Ứng dụng: thuật toán tìm kiếm theo c
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Khoa Viễn Thông 1
ĐỀ TÀI Trình bày thuật toán tìm cây khung sử dụng
BFS Môn học : Cấu trúc dữ liệu và giải thuật
GVHD: PGS.TS Lê Hải Châu
Nhóm: 06
Phạm Anh Hiếu – B21DCVT195
Vũ Nguyên Hoàng – B21DCVT Trần Quý Trung – B21DCVT
Lê Xuân Quảng – B21DCVT368 Phạm Ngọc Đức – B21DCVT
Trang 2Mục lục
I Giới thiệu chung 2
1 Thuật toán BFS 2
2 Mô tả thuật toán BFS 2
II Độ phức tạp của thuật toán 2
1 Độ phức tạp về thời gian của thuật toán BFS: O(V+E) 2
2 Độ phức tạp về không gian của thuật toán BFS: O(V) 2
III Ứng dụng của thuật toán tìm cây khung sử dụng BFS 3
1 Tìm đường đi ngắn nhất: 3
2 Phát hiện chu kỳ: 3
3 Các thành phần được kết nối: 3
4 Sắp xếp topo: 3
5 Truyền tải thứ tự cấp độ của cây nhị phân: 3
6 Định tuyến mạng: 3
IV Thuật toán 3
1 Lưu đồ thuật toán 3
Giải thích: 5
2 Thuật toán Tree - BFS(u) Ví dụ: 6
V Code mô phỏng thuật toán cây khung sử dụng BFS 10
1
Trang 3I Giới thiệu chung
1 Thuật toán BFS
Là một thuật toán truyền tải đồ thị cơ bản Nó liên quan đến việc truy cập
tất cả các nút được kết nối của biểu đồ theo từng cấp độ
Một thuật toán truyền tải đồ thị khám phá tất cả các đỉnh trong biểu đồ ở độ sâu hiện tại trước khi chuyển sang các đỉnh ở cấp độ sâu tiếp theo Nó bắt đầu
ở một đỉnh xác định và thăm tất cả các đỉnh lân cận trước khi chuyển sang
cấp độ lân cận tiếp theo BFS thường được sử dụng trong các thuật toán tìm
đường, các thành phần được kết nối và các vấn đề về đường đi ngắn nhất trong đồ thị Đây là một thuật toán trong trí tuệ nhân tạo Cấu trúc dữ liệu được sử dụng là hàng đợi (quene)
Ứng dụng: thuật toán tìm kiếm theo chiều rộng được dùng để giải nhiều bài toán lí thuyết đồ thị, chẳng hạn như:
- Tìm tất cả các đỉnh trong một thành phần liên thông
- Tìm đường đi ngắn nhất giữa hai đỉnh u và v (với chiều dài đường đi tính bằng số cung)
- Kiểm tra xem một đồ thị có là đồ thị hai phía
- Tìm các thành phần liên thông
Ưu điểm:
- Xét duyệt tất cả các đỉnh để trả về kết quả
- Nếu số đỉnh hữu hạn, thuật toán chắc chắn tìm ra kết quả
Nhược điểm:
- Mang tính chất vét cạn, không nên áp dụng nếu số đỉnh quá lớn
- Mang tính chất mù quáng, duyệt tất cả đỉnh, không chú ý đến thông tin trong các đỉnh để duyệt hiệu quả, dẫn đến duyệt qua các đỉnh không cần thiết
2 Mô tả thuật toán Breadth First Search
Bước 1: Khởi tạo.
Bắt đầu từ một đỉnh bất kì trong đồ thị làm nguồn
Khởi tạo một danh sách các đỉnh đã được duyệt và một danh sách cạnh của các cây khung, ban đầu rỗng
Bước 2: Duyệt đồ thị sử dụng BFS.
Đưa đỉnh nguồn vào hàng đợi
Lặp lại các bước sau cho đến khi hàng đợi trống
o Lấy đỉnh đầu tiên ra khỏi hàng đợi
Trang 4o Duyệt qua tất cả các đỉnh kề với đỉnh hiện tại
o Chọn các cạnh kề với đỉnh hiện tại mà chưa được duyệt và không tạo chu trình
o Thêm các cạnh này vào danh sách cạnh của cây khung và đánh dấu các đỉnh tương ứng là đã duyệt
o Đưa ra các đỉnh kề chưa được duyệt vào hàng đợi
Bước 3 :
Sau khi duyệt hết tất cả các đỉnh hoặc không còn cạnh nào để thêm vào cây khung, thuật toán kết thúc
II Độ phức tạp của thuật toán.
Độ phức tạp về thời gian của thuật toán BFS: O(V+E)
BFS khám phá tất cả các đỉnh và cạnh trong đồ thị Trong trường hợp xấu nhất, nó ghé thăm mọi đỉnh và cạnh một lần Do đó, độ phức tạp về thời gian của BFS là O(V + E), trong đó V và E là số đỉnh và cạnh trong đồ thị đã cho
Ảnh hưởng: độ phức tạp thời gian có nghĩa là thời gian chạy cảu BFS tỉ lệ với
số lượng đỉnh V và cạnh E trong đồ thị Từ đó BFS có thể chạy hiệu quả trên các đồ thị có kích thước vừa phải, nhưng có thể chậm trên các đồ thị cực lớn
và phức tạp Với các đò thị lớn, việc sử dụng BFS có thể dẫn đến thời gian chạy quá lâu, ảnh hưởng đén tính thực tế của ứng dụng
Độ phức tạp về không gian của thuật toán BFS: O(V)
BFS sử dụng hàng đợi để theo dõi các đỉnh cần truy cập Trong trường hợp xấu nhất, hàng đợi có thể chứa tất cả các đỉnh trong biểu đồ Do đó, độ phức tạp không gian của BFS là O(V), trong đó V và E là số đỉnh và cạnh trong đồ thị đã cho
Ảnh hưởng: độ phức tạp không gian O(V) có nghĩa là BFS sử dụng bộ nhớ tỉ
lệ với số lượng đỉnh V trong đồ thị Điều này có thể trở thành vấn đề khi áp dụng BFS trên đồ thị lớn, vì có thể dẫn đến việc sử dụng quá nhiều bộ nhớ Đối với đồ thị có số lượng đỉnh rất lớn, việc sử dụng BFS có thể bị giới hạn bởi bộ nhớ có sẵn
III Ứng dụng của thuật toán tìm cây khung sử dụng BFS.
Tìm đường đi ngắn nhất:
BFS có thể được sử dụng để tìm đường đi ngắn nhất giữa hai nút trong biểu đồ không có trọng số Bằng cách theo dõi nút cha của mỗi nút trong quá trình truyền tải, đường đi ngắn nhất có thể được xây dựng lại
Phát hiện chu kỳ:
BFS có thể được sử dụng để phát hiện các chu trình trong biểu đồ Nếu một nút được truy cập hai lần trong quá trình truyền tải, nó cho biết sự hiện diện của một chu kỳ
3
Trang 5 Các thành phần được kết nối:
BFS có thể được sử dụng để xác định các thành phần được kết nối trong biểu đồ Mỗi thành phần được kết nối là một tập hợp các nút có thể liên lạc được với nhau
Sắp xếp topo:
BFS có thể được sử dụng để thực hiện sắp xếp tôpô trên biểu đồ tuần hoàn có hướng (DAG) Việc sắp xếp tôpô sắp xếp các nút theo thứ tự tuyến tính sao cho đối với bất kỳ cạnh nào (u, v), u xuất hiện trước v theo thứ tự
Truyền tải thứ tự cấp độ của cây nhị phân:
BFS có thể được sử dụng để thực hiện truyền tải thứ tự cấp độ của cây nhị phân Quá trình truyền tải này truy cập tất cả các nút ở cùng cấp độ trước khi chuyển sang cấp độ tiếp theo
Định tuyến mạng:
BFS có thể được sử dụng để tìm đường đi ngắn nhất giữa hai nút trong mạng, giúp nó hữu ích cho việc định tuyến các gói dữ liệu trong các giao thức mạng
IV Sơ đồ khối.
Lưu đồ thuật toán
Trang 7Giải thích:
Sơ đồ khối cho thuật toán tìm cây khung BFS (Breadth-First Search) mô tả cách chương trình của bạn khám phá và xây dựng cây khung của một đồ thị bắt đầu từ một đỉnh cho trước Dưới đây là giải thích từng bước của sơ đồ:
1 Bắt đầu
● Đây là điểm bắt đầu của thuật toán BFS
2 Nhập số lượng đỉnh và cạnh:
● Bước này nhắc người dùng nhập số lượng đỉnh và số lượng cạnh trong đồ thị
Thông tin này rất cần thiết để xây dựng biểu diễn đồ thị
3 Khởi tạo mảng đã truy cập:
● Phần này tạo một mảng đã truy cập, là một mảng có kích thước bằng số lượng
đỉnh trong đồ thị Mỗi phần tử trong mảng ban đầu được đặt thành False, cho biết không có nút nào được truy cập
4 Nhập đỉnh bắt đầu:
● Bước này nhắc người dùng nhập đỉnh bắt đầu, đó là nút mà từ đó phép duyệt BFS
sẽ bắt đầu
5 Tạo một hàng đợi trống:
● Phần này tạo một hàng đợi trống, sẽ được sử dụng để lưu trữ các đỉnh cần khám
phá trong quá trình duyệt
6 Thêm đỉnh bắt đầu vào hàng đợi:
● Bước này thêm đỉnh bắt đầu vào hàng đợi Điều này cho biết rằng đỉnh bắt đầu là
nút đầu tiên được khám phá
7 Vòng lặp while hàng đợi không rỗng:
● Vòng lặp này tiếp tục miễn là còn có các nút chưa truy cập trong hàng đợi Điều
này đảm bảo rằng toàn bộ đồ thị được khám phá
8 Lấy đỉnh ra khỏi hàng đợi:
● Bước này xóa đỉnh đầu tiên khỏi hàng đợi Đây là nút hiện tại đang được truy cập
trong phép duyệt
9 Đánh dấu đỉnh hiện tại là đã truy cập:
● Phần này đặt phần tử tương ứng trong mảng đã truy cập thành True, cho biết rằng
đỉnh hiện tại đã được truy cập
10 Đối với mỗi đỉnh kề của đỉnh hiện tại:
● Vòng lặp này lặp qua tất cả các đỉnh kề (đỉnh được kết nối với) đỉnh hiện tại.
11 Nếu đỉnh kề chưa được truy cập:
● Câu lệnh điều kiện này kiểm tra xem đỉnh kề hiện tại đã được truy cập trước đó
hay chưa Nếu nó chưa được truy cập, có nghĩa là đó là một nút mới cần khám phá
12 Thêm đỉnh cuối vào hàng đợi:
Trang 8● Bước này thêm đỉnh cuối truy cập vào hàng đợi Điều này cho biết rằng đỉnh cuối
sẽ được khám phá trong lần lặp tiếp theo của vòng lặp
13 Đánh dấu đỉnh cuối là đã truy cập:
● Phần này đặt phần tử tương ứng trong mảng đã truy cập thành True, cho biết rằng
đỉnh đã được truy cập
14 In ra các cặp cạnh (liền kề, đỉnh):
● Bước này in ra các cặp cạnh nối giữa đỉnh hiện tại và đỉnh kề Điều này đại diện
cho đường dẫn được phát hiện trong quá trình duyệt
15 Kết thúc:
● Đây là điểm kết thúc của thuật toán BFS.
3 Thuật toán Tree – BFS(u)
Begin
Bước 1 (Khởi tạo):
T = ∅; //Tập cạnh cây khung ban đầu
Queue = ∅; //Thiết lập hàng đợi ban đầu;
Push(Queue, u); //Đưa u vào hàng đợi;
chuaxet[u] = False;//Bật trạng thái đã xét của đỉnh u
Bước 2 (Lặp):
while (Queue≠ ∅ ) do { //Lặp cho đến khi hàng đợi rỗng
s = Pop(Queue); Lấy s ra khỏi hàng đợi for each t ∈Ke(s) do { //Lặp trên danh sách Ke(s)
if (chuaxet[t] ) then { //Nếu đỉnh t chuaxet
Push(Queue, t);// Đưa t vào hàng đợi
T = T∪(s,t); //Kết nạp (s,t) vào cây khung chuaxet[t] = False; //Ghi nhận t đã xét endif ;
endfor ; endwwhile ;
Bước 3 (Trả lại kết quả) :
if (| T | < n-1 ) <Đồ thị không liên thông> ; else <Ghi nhận tập cạnh T của cây khung" ;
end.
Ví dụ:
Ma trận kề
7
Trang 9Kiểm nghiệm thuật toán Tree - BFS Bước Trạng thái hàng đợi Tree – BFS(u) = ? T=?
Kết luận T = {(1,2), (1,3), (1,4), (3,5), (5,6), (5,7), (5,8), (5,9), (9,10), (10,11),
(10,12), (10,13)}
Trang 10V Code mô phỏng thuật toán cây khung sử dụng BFS.
#include<bits/stdc++.h>
#define MAX 50
using namespace std;
struct Edge {
int u, v;
};
int n, sc;
vector<int> adj[MAX];
bool chuaxet[MAX];
vector<Edge> CBT;
void Init() {
cout << "Nhap so dinh cua do thi: ";
cin >> n;
int m; // So canh
cout << "Nhap so canh cua do thi: ";
cin >> m;
cout << "Nhap cac canh cua do thi (dinh bat dau, dinh ket thuc):" << endl;
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i = 1; i <= n; ++i) {
chuaxet[i] = true;
}
9
Trang 11void TREE_BFS(int u) {
queue<int> QUEUE;
QUEUE.push(u);
chuaxet[u] = false;
while (!QUEUE.empty()) {
int v = QUEUE.front();
QUEUE.pop();
for (int p : adj[v]) {
if (chuaxet[p]) {
chuaxet[p] = false;
sc++;
CBT.push_back({v, p});
QUEUE.push(p);
if (sc == n - 1) return;
}
}
}
}
void Result() {
for (int i = 0; i < sc; ++i) {
cout << "Canh " << i + 1 << ": " << CBT[i].u << " - " << CBT[i].v << endl;
}
}
int main() {
Init();
sc = 0;
Trang 12// Xây dung cây bao trùm tu dinh 1
TREE_BFS(1);
if (sc < n - 1) {
cout << "Do thi khong lien thong" << endl;
} else {
Result();
}
return 0;
}
Kết quả kiểm nghiệm thuật toán:
Nhận xét: Kết quả kiểm nghiệm thuật toán sử dụng BFS để xây dựng cây khung hoàn toàn trùng khớp với kết quả đã tính
11