Bài giảng Toán rời rạc 2 - Chương 3: Tìm kiếm trên đồ thị - Ngô Xuân Bách

Học viện Công nghệ Bưu chính Viễn thông  
Khoa Công nghệ thông tin 1  
Toán ri rc 2  
Tìm kiếm trên đthị  
Ngô Xuân Bách  
Ni dung  
Thuật toán tìm kiếm theo chiều sâu (Depth-First Search) - DFS)  
Thuật toán tìm kiếm theo chiều rộng (Breadth-First Search - BFS)  
Một số ứng dụng của DFS và BFS  
2
Tìm kiếm theo chiu sâu - DFS  
Tư tưởng  
o Trong quá trình tìm kiếm, ưu tiên chiều sâu” hơn “chiều rộng”  
o Đi xuống sâu nhất thể trước khi quay lại  
Thuật toán  
DFS(){ //đnh bt đu duyt  
<Thăm đnh >; //duyt đnh 푢  
푐ℎ푢푎푥푒푡,푢- = 푓푎푙푠푒; //xác nhn đnh đã duyt  
for(푣 ∈ 퐾푒(푢)){  
if( 푐ℎ푢푎푥푒푡,푣-)  
//nếu chưa được duyt  
DFS(); //duyt theo chiu sâu t푣  
}
}
3
DFS sdng ngăn xếp  
DFS(){  
Bước 1: Khi to  
푠푡푎푐푘 = ∅; //khi to 푠푡푎푐푘 ∅  
p푢푠ℎ(푠푡푎푐푘, 푢); //đưa đnh vào ngăn xếp  
<Thăm đnh >; //duyt đnh 푢  
푐ℎ푢푎푥푒푡,푢- = 푓푎푙푠푒; //xác nhn đnh đã duyt  
Bước 2: Lp  
while(푠푡푎푐푘 ≠ ∅){  
푠 = p표푝(푠푡푎푐푘); //ly đnh đu ngăn xếp  
for(푡 ∈ 퐾푒(푠)){  
if( 푐ℎ푢푎푥푒푡,푡-){ //nếu chưa được duyt  
<Thăm đnh >; //duyt đnh 푡  
푐ℎ푢푎푥푒푡,푡- = 푓푎푙푠푒; //đã duyt  
p푢푠ℎ(푠푡푎푐푘, 푠); //đưa vào ngăn xếp  
p푢푠ℎ(푠푡푎푐푘, 푡); //đưa vào ngăn xếp  
beak; //chly mt đnh 푡  
}
}
}
Bước 3: Trli kết quả  
return <tp đnh đã duyt>;  
}
4
Đphc tp thut toán DFS  
Độ phức tạp thuật toán DFS() phụ thuộc vào phương  
pháp biểu diễn đồ thị  
Biểu diễn đồ thị bằng ma trận kề  
o Độ phức tạp thuật toán là 푂(푛2), số đỉnh  
Biểu diễn đồ thị bằng danh sách cạnh  
o Độ phức tạp thuật toán là 푂(푛. 푚), số đỉnh, số cạnh  
Biểu diễn đồ thị bằng danh sách kề  
o Độ phức tạp thuật toán là 푂(max(푛, 푚)), là số đỉnh, là số  
cạnh  
5
Kim nghim thut toán DFS (1/2)  
dụ 1: Cho đồ thị gồm 13 đỉnh như hình vẽ. Hãy kiểm  
nghiệm thuật toán DFS(1).  
(Phương ND, 2013)  
6
Kim nghim thut toán DFS (2/2)  
STT  
Trng thái ngăn xếp  
Danh sách đnh được duyt  
1
2
1
1
1, 2  
1, 2  
1, 2, 4  
3
1, 2, 4  
1, 2, 4, 3  
1, 2, 4  
1, 2, 4, 6  
4
1, 2, 4, 3  
5
1, 2, 4, 3  
6
1, 2, 4, 3, 6  
7
1, 2, 4, 6, 7  
1, 2, 4, 3, 6, 7  
8
1, 2, 4, 6  
1, 2, 4, 3, 6, 7  
9
1, 2, 4, 6, 8  
1, 2, 4, 3, 6, 7, 8  
10  
11  
12  
13  
14  
15  
1, 2, 4, 6, 8, 10  
1, 2, 4, 3, 6, 7, 8, 10  
1, 2, 4, 3, 6, 7, 8, 10, 5  
1, 2, 4, 3, 6, 7, 8, 10, 5, 9  
1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13  
1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11  
1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12  
1, 2, 4, 6, 8, 10, 5  
1, 2, 4, 6, 8, 10, 5, 9  
1, 2, 4, 6, 8, 10, 5, 9, 13  
1, 2, 4, 6, 8, 10, 5, 9, 13, 11  
1, 2, 4, 6, 8, 10, 5, 9, 13, 11, 12  
16- Ln lượt bcác đnh ra khi ngăn xếp  
Kết quduyt: 1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12  
7
Bài tp 1  
Cho đồ thị gồm 13  
đỉnh được biểu diễn  
dưới dạng ma trận kề  
như hình vẽ. Hãy cho  
biết kết quả thực hiện  
thuật toán DFS(1).  
Chỉ trạng thái của  
ngăn xếp tập đỉnh  
được duyệt theo mỗi  
bước thực hiện của  
thuật toán.  
(Phương ND, 2013)  
8
Ni dung  
Thuật toán tìm kiếm theo chiều sâu (Depth-First Search) - DFS)  
Thuật toán tìm kiếm theo chiều rộng (Breadth-First Search - BFS)  
Một số ứng dụng của DFS và BFS  
9
Tìm kiếm theo chiu rng - BFS  
Tư tưởng  
o Trong quá trình tìm kiếm, ưu tiên chiều rộng” hơn “chiều sâu”  
o Tìm kiếm xung quanh trước khi đi xuống sâu hơn  
Thuật toán  
BFS(){  
Bước 1: Khi to  
푞푢푒푢푒 = ∅; p푢푠ℎ(푞푢푒푢푒, 푢); 푐ℎ푢푎푥푒푡,푢- = 푓푎푙푠푒;  
Bước 2: Lp  
while(푞푢푒푢푒 ≠ ∅){  
푠 = p표푝(푞푢푒푢푒); <Thăm đnh >;  
for(푡 ∈ 퐾푒(푠)){  
if( 푐ℎ푢푎푥푒푡,푡-){  
p푢푠ℎ(푞푢푒푢푒, 푡); 푐ℎ푢푎푥푒푡,푡- = 푓푎푙푠푒;  
}
}
}
Bước 3: Trli kết quả  
return <tp đnh đã duyt>;  
}
10  
Đphc tp thut toán BFS  
Độ phức tạp thuật toán BFS() phụ thuộc vào phương  
pháp biểu diễn đồ thị  
Biểu diễn đồ thị bằng ma trận kề  
o Độ phức tạp thuật toán là 푂(푛2), số đỉnh  
Biểu diễn đồ thị bằng danh sách cạnh  
o Độ phức tạp thuật toán là 푂(푛. 푚), số đỉnh, số cạnh  
Biểu diễn đồ thị bằng danh sách kề  
o Độ phức tạp thuật toán là 푂(max(푛, 푚)), là số đỉnh, là số  
cạnh  
11  
Kim nghim thut toán BFS (1/2)  
Cho đồ thị gồm 13  
đỉnh được biểu diễn  
dưới dạng ma trận kề  
như hình vẽ. Hãy cho  
biết kết quả thực hiện  
thuật toán BFS(1). Chỉ  
trạng thái của hàng  
đợi tập đỉnh được  
duyệt theo mỗi bước  
thực hiện của thuật  
toán.  
(Phương ND, 2013)  
12  
Kim nghim thut toán BFS (2/2)  
STT  
Trng thái hàng đi  
Danh sách đnh được duyt  
1
2
1
2, 3, 4  
3, 4, 6  
4, 6, 5  
6, 5, 7  
5, 7, 12  
7, 12, 8  
12, 8  
8, 10  
10  
1
3
1, 2  
4
1, 2, 3  
5
1, 2, 3, 4  
6
1, 2, 3, 4, 6  
7
1, 2, 3, 4, 6, 5  
8
1, 2, 3, 4, 6, 5, 7  
9
1, 2, 3, 4, 6, 5, 7, 12  
1, 2, 3, 4, 6, 5, 7, 12, 8  
1, 2, 3, 4, 6, 5, 7, 12, 8, 10  
1, 2, 3, 4, 6, 5, 7, 12, 8, 10, 9  
1, 2, 3, 4, 6, 5, 7, 12, 8, 10, 9, 11  
1, 2, 3, 4, 6, 5, 7, 12, 8, 10, 9, 11, 13  
10  
11  
12  
13  
14  
9, 11, 13  
11, 13  
13  
Kết quduyt: 1, 2, 3, 4, 6, 5, 7, 12, 8, 10, 9, 11, 13  
13  
Chú ý  
Với đồ thị hướng  
o Nếu 퐷퐹푆(푢) = 푉 hoặc 퐵퐹푆(푢) = 푉, ta có thể kết luận đồ thị liên  
thông  
Với đồ thị hướng  
o Nếu 퐷퐹푆(푢) = 푉 hoặc 퐵퐹푆(푢) = 푉, ta có thể kết luận đồ thị liên  
thông yếu  
14  
Ni dung  
Thuật toán tìm kiếm theo chiều sâu (Depth-First Search) - DFS)  
Thuật toán tìm kiếm theo chiều rộng (Breadth-First Search - BFS)  
Một số ứng dụng của DFS và BFS  
15  
Xác định thành phần liên thông của đồ thị  
Phát biểu bài toán  
o Cho đồ thị hướng 퐺 =< 푉, 퐸 >, trong đó tập đỉnh, tập  
cạnh. Xác định các thành phần liên thông của ?  
Thuật toán  
Duyet-TPLT(){ //duyt thành phn liên thông  
Bước 1: Khi to  
푠표푇푃퐿푇 = 0; //khi to sthành phn liên thông bng 0  
Bước 2: Lp  
for(푢 ∈ 푉){ //lp trên tp đnh  
if( 푐ℎ푢푎푥푒푡,푢-){  
푠표푇푃퐿푇 = 푠표푇푃퐿푇 + 1;//ghi nhn sTPLT  
푩푭푺(풖); // có thgi 푫푭푺 풖  
<Ghi nhn các đnh thuc TPLT>;  
}
}
Bước 3: Trli kết quả  
return <các TPLT>;  
}
16  
Bài tp 2  
Cho đồ thị hướng  
được biểu diễn dưới  
dạng ma trận kề như  
hình vẽ. Xác định các  
thành phần liên thông  
của đồ thị?  
(Phương ND, 2013)  
17  
Tìm đường đi giữa các đỉnh trên đồ thị (1/4)  
Phát biểu bài toán  
o Cho đồ thị 퐺 =< 푉, 퐸 > (hướng hoặc hướng), trong đó là  
tập đỉnh, tập cạnh. Hãy tìm đường đi từ 푠 ∈ 푉 đến 푡 ∈ ?  
tả thuật toán  
o Nếu 푡 ∈ 퐷퐹푆(푠) hoặc 푡 ∈ 퐵퐹푆(푠) thì ta có thể kết luận có đường đi  
từ đến trên đồ thị, ngược lại sẽ không có đường đi  
o Để ghi nhận đường đi ta sử dụng mảng 푡푟푢표푐,- gồm phần tử  
(푛 = |푉|)  
. Khởi tạo ban đầu 푡푟푢표푐 푢 = 0 với mọi 푢  
. Mỗi khi đưa 푣 ∈ 퐾푒(푢) vào ngăn xếp (nếu sử dụng 퐷퐹푆) hoặc hàng đợi  
(nếu sử dụng 퐵퐹푆) ta ghi nhận 푡푟푢표푐 푣 = 푢  
. Nếu 퐷퐹푆 퐵퐹푆 không duyệt được đến đỉnh , khi đó 푡푟푢표푐,푡- = 0 thì  
ta kết luận không có đường đi từ đến 푡  
18  
Tìm đường đi giữa các đỉnh trên đồ thị (2/4)  
Sử dụng thuật toán DFS  
DFS(){  
Bước 1: Khi to  
푠푡푎푐푘 = ∅; p푢푠ℎ(푠푡푎푐푘, 푠); 푐ℎ푢푎푥푒푡,푠- = 푓푎푙푠푒;  
Bước 2: Lp  
while(푠푡푎푐푘 ≠ ∅){  
푢 = p표푝(푠푡푎푐푘); //ly đnh ngăn xếp  
for(푣 ∈ 퐾푒(푢)){  
if( 푐ℎ푢푎푥푒푡,푣-){ //nếu chưa được duyt  
푐ℎ푢푎푥푒푡,푣- = 푓푎푙푠푒; //đã duyt  
p푢푠ℎ(푠푡푎푐푘, 푢); //đưa vào ngăn xếp  
p푢푠ℎ(푠푡푎푐푘, 푣); //đưa vào ngăn xếp  
풕풓풖풐풄,풗- = 풖; //Ghi nhn 푡푟푢표푐,푣- 푢  
beak; //chly mt đnh 푡  
}
}
}
Bước 3: Trli kết quả  
return <tp đnh đã duyt>;  
}
19  
Tìm đường đi giữa các đỉnh trên đồ thị (3/4)  
Sử dụng thuật toán BFS  
BFS(){  
Bước 1: Khi to  
푞푢푒푢푒 = ∅; p푢푠ℎ(푞푢푒푢푒, 푠); 푐ℎ푢푎푥푒푡,푠- = 푓푎푙푠푒;  
Bước 2: Lp  
while(푞푢푒푢푒 ≠ ∅){  
푢 = p표푝(푞푢푒푢푒);  
for(푣 ∈ 퐾푒(푢)){  
if( 푐ℎ푢푎푥푒푡,푣-){  
p푢푠ℎ(푞푢푒푢푒, 푣);  
푐ℎ푢푎푥푒푡,푣- = 푓푎푙푠푒;  
풕풓풖풐풄 풗 = 풖;  
}
}
}
Bước 3: Trli kết quả  
return <tp đnh đã duyt>;  
}
20  
Tải về để xem bản đầy đủ
pdf 32 trang myanh 27/04/2022 12220
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Toán rời rạc 2 - Chương 3: Tìm kiếm trên đồ thị - Ngô Xuân Bách", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_toan_roi_rac_2_chuong_3_tim_kiem_tren_do_thi_ngo_x.pdf