Tải bản đầy đủ (.ppt) (70 trang)

chương 3 các THUẬT TOÁN DUYỆT đồ THỊ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (533.74 KB, 70 trang )

Chương 3
C¸c thuËt to¸n duyÖt ®å
thÞ (Graph Searching, Graph Traversal)

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

1


Các thuật toán duyệt đồ thị
• Duyệt đồ thị: Graph Searching hoặc Graph Traversal
• Duyệt qua mỗi đỉnh và mỗi cạnh của đồ thị

• Ứng dụng:
• Cần để khảo sát các tính chất của đồ thị
• Là thành phần cơ bản của nhiều thuật toán trên đồ thị

• Hai thuật toán duyệt cơ bản:
• Tìm kiếm theo chiều rộng (Breadth First Search – BFS)
• Tìm kiếm theo chiều sâu (Depth First Search – DFS)

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

2


Ý tưởng chung của các thuật toán duyệt
Ý tưở ng chung:
• Trong quá trình thực hiện thuật toán, mỗi đỉ nh ở một trong ba trạng thái:


• Chưa thăm, thể hiện bởi màu trắng
• Đã thăm (nhưng chưa duyệt xong), thể hiện bởi màu xám
• Đã duyệt xong, thể hiện bởi màu đen

• Trạng thái của đỉ nh sẽ biến đổ i theo qui tắc sau:
• Thoạt đầu mỗi đỉnh đều có màu trắng (chưa thăm - not visited).
• Đỉnh đã được thăm sẽ chuyển thành màu xám (trở thành đã thăm nhưng chưa
duyệt xong - visited).
• Khi tất cả các đỉnh kề của một đỉnh v là đã được thăm, đỉnh v sẽ có màu đen (đã
duyệt xong – discovered).
Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

3


Tìm kiếm theo chiều rộng
Breadth-first Search (BFS)

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

4


Tìm kiếm theo chiều rộng
Breadth-first Search
• Input: Đồ thị G = (V, E), vô hướ ng hoặc có hướ ng.
• Output:
• d[v] = khoảng cách (độ dài của đường đi ngắn nhất) từ s (là

đỉnh xuất phát tìm kiếm) đến v, với mọi v ∈ V. d[v] = ∞
nếu v không đạt tới được từ s.
• π [v] = u đỉnh đi trước v trong đường đi từ s (là đỉnh xuất
phát tìm kiếm) đến v có độ dài d[v].
• Xây dựng cây BFS với gốc tại s chứa tất cả các đỉnh đạt tới
được từ s.

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

5


Procedure
ProcedureBFS(s);
BFS(s);
(*(*Tìm
Tìmkikiếếmmtheo
theochi
chiềềuurộ
rộng
ngbbắắt tđầ
đầuutừ
từđỉđỉnh
nhss*)*)
begin
begin
color[s]
color[s]←
←gray;

gray;
d[s]

0;
π
[s]
d[s] ← 0; π [s]←
←nil;
nil;
QQ←

;
enqueue(Q,s);
← ∅ ; enqueue(Q,s);(*(*Nạp
Nạps svào
vàoQQ*)*)
while
whileQQ≠≠∅∅do
do
begin
begin
uu←
←dequeue(Q);
dequeue(Q);(*(*Lấy
Lấyuutừ
từQQ*)*)
for
forvv∈∈Adj[u]
Adj[u]do
do

ififcolor[v]
=
white
color[v] = whitethen
then
begin
begin
color[v]
color[v]←
←gray;
gray;
d[v]
d[v]←
←d[u]
d[u]++1;1;ππ[v]
[v]←
←u;u;
enqueue(Q,v)
enqueue(Q,v) (*(*Nạp
Nạpvvvào
vàoQQ*)*)
end;
end;
color[u]
color[u]←
←black
black
end;
end;


Trắng: chưa thăm
xám: đã thăm
đen: đã duyệt xong

Q: hàng đợi các đỉnh được
thăm
color[v]: màu của đỉnh v
d[v]: khoảng cách từ s đến v
π[u]: đỉnh đi trước v

end;
end;
BEGIN
BEGIN(*(*Main
MainProgram*)
Program*)

Ví dụ: xem minh hoạ

for
forvv∈∈VVdo
do(*(*Khởi
Khởitạo
tạo*)*)
begin
begin
color[v]
color[v]←
←white;
white;d[v]

d[v]←
←∝∝; ; ππ[v]
[v]←
←nil;
nil;
end;
end;
for
forvv∈∈VVdo
do
ififcolor[v]=white
color[v]=whitethen
thenBFS(v);
BFS(v);

END.
END.

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

6


Ví dụ (BFS)
r


0



v


w

s

Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

u





y

x
Q: s
0

Phần 2. LÝ THUYẾT ĐỒ THỊ

t


7



Ví dụ (BFS)
r

s

1

0


v

1
w

t


u





y

x
Q: w r
1 1


Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

8


Ví dụ (BFS)
r

s

1

0


v

1
w

t
2

u


2



y

x
Q: r t x
1 2 2

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

9


Ví dụ (BFS)
r

s

1

0

2
v

1
w

t
2


u


2


y

x
Q: t x v
2 2 2

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

10


Ví dụ (BFS)
r

s

1

0

2
v


1
w

t
2

u
3

2


y

x
Q: x v u
2 2 3

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

11


Ví dụ (BFS)
r

s

1


0

2
v

1
w

t
2

u
3

2

3
y

x
Q: v u y
2 3 3

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

12



Ví dụ (BFS)
r

s

1

0

2
v

1
w

Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

u
3

2

3
y

x
Q: u y
3 3

Phần 2. LÝ THUYẾT ĐỒ THỊ


t
2

13


Ví dụ (BFS)
r

s

1

0

2
v

1
w

Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

u
3

2

3

y

x
Q: y
3

Phần 2. LÝ THUYẾT ĐỒ THỊ

t
2

14


Ví dụ (BFS)
r

s

1

0

2
v

1
w

Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội


u
3

2

3
y

x
Q: ∅

Phần 2. LÝ THUYẾT ĐỒ THỊ

t
2

15


Ví dụ (BFS)
r

s

1

0

2

v

1
w

t
2

u
3

2

3
y

x
Cây BFS(s)

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

16


Phân tích BFS
• Việc khởi tạo đòi hỏi O(|V|).
• Vòng lặp duyệt
• Mỗi đỉnh được nạp vào và loại ra khỏi hàng đợi một lần, mỗi thao tác
đòi hỏi thời gian O(1). Như vậy tổng thời gian làm việc với hàng đợi là

O(V).
• Danh sách kề của mỗi đỉnh được duyệt qua đúng một lần. Tổng độ dài
của tất cả các danh sách kề là Θ (|E|).

• Tổng cộng ta có thời gian tính của BFS(s)
là O(|V|+|E|),là tuyến tính theo kích
thước của danh sách kề biểu diễn đồ thị.
Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

17


Cây BFS(s)
,

• Đối với đồ thị G = (V, E) và đỉnh s. Thực hiện BFS(s) xét đồ thị
con Gπ = (Vπ , Eπ) trong đó
• Vπ ={v∈ V : π [v] ≠ NIL}{s}
• Eπ ={(π [v],v)∈ E : v ∈ Vπ \ {s}}

• Gπ = (Vπ , Eπ) là cây và được gọi là cây BFS(s)
• Các cạnh trong Eπ được gọi là cạnh của cây. |Eπ | = |Vπ | - 1.
• BFS(s) cho phép đến thăm tất cả các đỉnh đạt tới được từ s.
• Trình tự thăm các đỉnh khi thực hiện BFS(s): Đầu tiên đến thăm
các đỉnh đạt được từ s bởi đường đi qua 1 cạnh, sau đó là thăm
các đỉnh đạt được từ s bởi đường đi qua 2 cạnh, …Do đó nếu đỉnh t
được thăm trong BFS(s) thì nó sẽ được thăm theo đường đi ngắn
nhất theo số cạnh.
Phần 2. LÝ THUYẾT ĐỒ THỊ

Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

18


BFS – Loang trên đồ thị
• Thứ tự thăm đỉ nh nhờ thực hiện BFS(A)
L0

A

B

C
E

Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

L1

D

B

L2

F

19


A
C
E

D
F


Ứng dụng trực tiếp cuả BFS
• Sử dụng BFS để kiểm tra tính liên thông
của đồ thị vô hướng:
• Mỗi lần gọi đến BFS ở trong chương trình chính sẽ sinh ra một thành
phần liên thông

• Xét sự tồn tại đường đi từ đỉnh s đến đỉnh t:
• Thực hiện BFS(s).
• Nếu π [t] = NIL thì không có đường đi, trái lại ta có đường đi
t  π [t]  π [π [ t]]  . . .  s

• Chú ý: BFS tìm được đường đi ngắn nhất
theo số cạnh.
Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

20


Tìm kiếm theo chiều sâu
Depth-first Search (DFS)


Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

21


í tng ca tỡm kim theo chiu sõu
Ta sẽ bắt đầu tìm kiếm từ một đỉnh s nào đó của đồ thị. Sau đó
chọn u là một đỉnh tuỳ ý kề với s và lặp lại quá trình đối với u.
ở bớc tổng quát, giả sử ta đang xét đỉnh v:
Nếu nh trong số các đỉnh kề với v tìm đợc đỉnh w là cha đợc thm thì ta
sẽ thm đỉnh này (nó sẽ trở thành đã thm nhng cha duyt xong) và
bắt đầu từ nó ta sẽ tiếp tục quá trình tìm kiếm.
Nếu nh không còn đỉnh nào kề với v là cha thm thì ta sẽ nói rằng đỉnh
này là đã duyệt xong và quay trở lại tiếp tục tìm kiếm từ đỉnh mà trớc đó
ta đến đợc đỉnh v (nếu v = s, thì kết thúc tìm kiếm).

Có thể nói nôm na là tìm kiếm theo chiều sâu bắt đầu từ đỉnh s đ
ợc thực hiện trên cơ sở tìm kiếm theo chiều sâu từ tất cả các đỉnh
cha thm kề với s.
Phn 2. Lí THUYT TH
Nguyn c Ngha- B mụn KHMT, HBK H ni

22


Mô tả DFS
• Input: Đồ thị G = (V, E) cho bởi danh sách kề
• Output:

• 2 mốc thời gian cho mỗi đỉnh (là các số nguyên trong khoảng 1
và 2|V|).
• d[v] = thời điểm bắt đầu thăm (v chuyển từ trắng
sang xám)
• f [v] = thời điểm kết thúc thăm (v chuyển từ xám
sang đen)
• π [v] : đỉnh đi trước v – tức là đỉnh mà từ đó ta đến thăm v.
• Sử dụng biến color để ghi nhận trạng thái của các đỉ nh như đã
mô tả.
Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

23


Depth-First Search: Code
DFS(G)

procedure DFS(u);

BEGIN

begin

for v∈ V do

color[u] = GRAY;

begin


time = time+1;
d[u] = time;

color[v] = WHITE;

for v ∈ Ke(u)do

π [v] = NIL

if (color[v]= WHITE)then

end;

begin

time = 0;

π [v] = u;

for u∈ V do

DFS(v);

begin

end;

if (color[u]= WHITE) then

color[u] = BLACK;


DFS(u);

time = time+1;

end;

f[u] = time;

END.
Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

24

end;


Phân tích thuật toán DFS
• Mỗi đỉ nh đượ c thăm đúng 1 lần, việc thăm mỗi đỉ nh đòi hỏi
chi phí thời gian O(1), suy ra thao tác thăm đỉ nh đòi hỏi thời
gian O(|V|).
• Vòng lặp trong DFS(u) thực hiện việc duyệt cạnh của đồ thị
• Mỗi cạnh được duyệt qua đúng một lần nếu đồ thị là có hướng và 2
lần nếu đồ thị là vô hướng
• Như vậy tổng số lần lặp là O(|E|).

• Vậy, thuật toán có thời gian O(|V|+|E|)
• Đối với đồ thị, thuật toán có đánh giá như vậy gọi là thuật
toán thời gian tuyến tính


Phần 2. LÝ THUYẾT ĐỒ THỊ
Nguyễn Đức Nghĩa- Bộ môn KHMT, ĐHBK Hà nội

25


×