1. Trang chủ
  2. » Giáo Dục - Đào Tạo

đề tài trình bày thuật toán tìm cây khung sử dụng bfs

12 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Trình bày thuật toán tìm cây khung sử dụng BFS
Tác giả Phạm Anh Hiếu, Vũ Nguyên Hoàng, Trần Quý Trung, Lê Xuân Quảng, Phạm Ngọc Đức
Người hướng dẫn PGS.TS Lê Hải Châu
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Cấu trúc dữ liệu và giải thuật
Thể loại Đề tài
Định dạng
Số trang 12
Dung lượng 162,79 KB

Nội dung

 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 1

HỌ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 2

Mụ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 3

I 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 4

o 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 7

Giả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 9

Kiể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 10

V 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 11

void 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

Ngày đăng: 27/07/2024, 16:11

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w