Nội dung Định nghĩa đồ thị Các giải thuật duyệt đồ thị Giải thuật trên đồ thị có trọng số Giải thuật trên đồ thị có hướng 2 ... Các giải thuật duyệt đồ thị Tìm kiếm theo chiề
Trang 1PHÂN TÍCH ĐỘ PHỨC TẠP
CÁC GIẢI THUẬT ĐỒ THỊ
1 CHƯƠNG 4
Trang 2Nội dung
Định nghĩa đồ thị
Các giải thuật duyệt đồ thị
Giải thuật trên đồ thị có trọng số
Giải thuật trên đồ thị có hướng
2
Trang 3Định nghĩa đồ thị3
Trang 4Phân loại đồ thị4
Trang 5Biểu diễn đồ thị trên máy tính5
Trang 6Biểu diễn đồ thị trên máy tính6
Trang 7Biểu diễn đồ thị trên máy tính7
Trang 8Biểu diễn đồ thị trên máy tính8
Trang 9Biểu diễn đồ thị trên máy tính9
Trang 10Biểu diễn đồ thị trên máy tính10
Trang 11Biểu diễn đồ thị trên máy tính11
Trang 12Biểu diễn đồ thị trên máy tính12
Trang 13Biểu diễn đồ thị trên máy tính13
Trang 14Biểu diễn đồ thị trên máy tính14
Trang 15Các giải thuật duyệt đồ thị
Tìm kiếm theo chiều rộng
Tìm kiếm theo chiều sâu
Tìm cây bao trùm nhỏ nhất
Tìm đường đi ngắn nhất
15
Trang 16Nội dung bài toán tìm kiếm
Cho đồ thị G=(V,E) và một đỉnh s Xuất phát từ đỉnh s, hãy duyệt qua tất cả các đỉnh của đồ thị
u đã xét xong Color(u)=BLACK
Trang 17Tìm kiếm theo chiều rộng
(Breadth-First Search-BFS)
Ý tưởng thuật toán
Bắt đầu tìm kiếm từ đỉnh s cho trước tuỳ ý
Tại thời điểm đã tìm thấy u, thuật toán tiếp tục tìm kiếm tập tất cả các đỉnh kề với u
Thực hiện quá trình này cho các đỉnh còn lại
17
Trang 18Tìm kiếm theo chiều rộng
(Breadth-First Search-BFS)
Ý tưởng thuật toán
Dùng một hàng đợi để duy trì trật tự tìm kiếm
Trang 19Tìm kiếm theo chiều rộng
6 For each v ∈ Adj(u)
7 if color(v)= WHITE then
8 color(v):=GRAY; Prev(v):= u;
9 ENQUEUE(Q,v);/*đặt v vào cuối hàng đợi*/
10 DeQueue(Q,u);/* Gỡ u khỏi hàng đợi */
11 Color(u):= BLACK;
Trang 21Q=B,C,D ,E
C B
E
F
C B
E
F
C B
E
F
Q=Rỗng
Trang 22Tìm kiếm theo chiều rộng
(Breadth-First Search-BFS)
Trang 24Phân tích thuật toán BFS
Tổng phí khởi tạo là O(V)
Mỗi thao tác trên hàng đợi là O(1), vì vậy tổng thời gian cho thao tác trên hàng đợi là O(V)
Tổng thời gian chi phí cho quét các danh sách kề
là O(E)
Tổng thời gian chạy của BFS là O(V+E)
24
Trang 25Tìm kiếm ưu tiên chiều sâu
(Depth-First Search-DFS)
Ý tưởng thuật toán
Bắt đầu tìm kiếm từ một đỉnh u nào đó
Chọn đỉnh kề v tùy ý của u để tiếp tục quá trình tìm kiếm và lặp lại quá trình tìm kiếm này đối với v
Dùng các màu để không lặp lại các đỉnh tìm kiếm
Dùng các biến thời gian để xác định các thời điểm phát hiện và hoàn thành tìm kiếm của một đỉnh
Dùng một mảng để lưu trữ đỉnh đi trước của đỉnh được tìm kiếm
Trang 26Tìm kiếm ưu tiên chiều sâu
5 then DFS-Visit (u)
Procedure DFS-Visit (u)
Trang 27Tìm kiếm ưu tiên chiều sâu (DFS)
Hàm Push(v,Stack) đặt phần tử v vào đỉnh ngăn xếp Stack
Hàm Pop(Stack) lấy phần tử đửng ở đỉnh ngăn xếp ra khỏi ngăn xếp
Trang 29F
C B
E
F
Trang 30F
C B
E
F
Trang 31Tìm kiếm ưu tiên chiều sâu
(Depth-First Search-DFS)
Trang 32Ví dụ: DFS(A) (tiếp)
Trang 33Phân tích thuật toán DFS
Nếu chưa tính thời gian thực thi DFS-VISIT, vòng lặp 1-3 và 5-7 có chi phí là O(V)
Trong một lần thực thi DFS-VISIT(v), vòng lặp 4-7 thực thi trong |Adj[v]| lần
Vì Σv ∈V|Adj[v]|= O(E), nên tổng chi phí thực thi dòng 4-7 của DFS-VISIT là O(E).
Vậy thời gian chạy của DFS là O(V+E)
33
Trang 34Phân tích thuật toán DFS
34
Trang 35Giải thuật trên đồ thị có trọng số
Cây bao trùm nhỏ nhất
Khái niệm
Thuật toán Kruskal
Thuật toán Prim
35
Trang 36Khái niệm
Cho G là một đồ thị vô hướng, liên thông có trọng số, n đỉnh và H là một đường đi, chu trình, cây, đồ thị con,…của G
G là đồ thị liên thông nếu luôn tồn tại đường đi giữa mọi cặp điểm phân biệt của đồ thị
Trọng số của H, ký hiệu w(H), là tổng trọng số của tất cả các cạnh của nó: w(H) = Σe∈Hw(e)
Bài toán: Tìm một cây bao trùm T có trọng số nhỏ nhất (minimum spanning tree-MST) của G
36
Trang 37THUẬT TOÁN KRUSKAL
Ý tưởng
Tại mỗi bước, thuật toán tìm một cạnh có trọng
số nhỏ nhất thêm vào tập cạnh của cây bao trùm sao cho không gây ra chu trình
Thuật toán dừng khi số cạnh của cây bằng số
đỉnh của đồ thị trừ 1
37
Trang 38Giải thuật KRUSKAL
Mô tả bằng ngôn ngữ tự nhiên
Trang 39Giải thuật KRUSKAL
Trang 41Giả mã giải thuật KRUSKAL
Trang 42 Procedure KRUSCAL
1 A:= ∅
2 For each u in V(G) do Make-Set(u);
3 Sắp xếp các cạnh của E(G) theo trong số không
giảm w;
4 For each (u,v) in E(G)
5 if Find-Set(u)<> Find-Set(v) then
Trang 43Giải thuật
Kruskal
- Ví dụ
Cạnh xét Các cây trong rừng Chọn AB(3) {A},{B},{C},{D},{E},
{F},{G} ABAD(4) {A,B},{D} , {C},{E},
B
A
C D
4
6 9
4 5
9
8 8
Trang 44Giải thuật KRUSKAL: Ví dụ
Trong quá trình xây dựng T luôn không có chu trình nên là một rừng
B
A
C D
4
6 9
4 5
9
8 8
Trang 45Giải thuật KRUSKAL
1 Chọn cạnh (u,v) có trọng số ϕ(u,v) nhỏ nhất thêm
vào T
2 Nếu T đã đủ n-1 cạnh thì dừng;
3 Chọn cạnh (u,v) có ϕ(u,v) nhỏ nhất sao cho khi
thêm vào T thì T không có chu trình;
4 Quay lại 2.
Trang 46Minh họa tư tưởng giải thuật
Kruscal
Chọn cạnh nhỏ nhất nối hai thành phần liên thông của T với nhau, Mỗi lần bớt đi một thành phần liên
thông
Trang 47Giải thuật Kruskal-
Ví dụ
B
A
C D
9 12 9
8
11 9
Trang 48Giải thuật KRUSKAL: Ví dụ
B
A
C D
9 12
9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12
9
8
11 9
Trong quá trình xây dựng T luôn không có chu trình nên là một rừng
Trang 49Đặc điểm của giải thuật KRUSKAL
Trong quá trình xây dựng T có là cây không?
Trong quá trình xây dựng T luôn không có chu trình nên là một rừng, có thể không là một cây
Khi nào một cạnh (u,v) tạo thành một chu trình với các cạnh đã có trong T ?
Khi hai đầu mút u, v thuộc cùng một cây của T
Trang 50Đánh giá giải thuật KRUSKAL
Thời gian sắp xếp là O(E lgE)
Chi phí cho tất cả các lần lặp trong vòng lặp while không quá O(V lgE)
Do đó, tổng chi phí là
O (E lg E + V lg E) = O (E lg E)
Trang 51THUẬT TOÁN PRIM
Thuật toán kết thúc khi tất cả các đỉnh của đồ thị
đã được chọn
Trang 52Giải thuật Prim
Mô tả bằng ngôn ngữ tự nhiên
/*Khởi tạo: mọi đỉnh chưa xét*/
V’:={s}, E’={} (rỗng); n’=1;
While n’ < n do
Begin
n’:=n’+1;
End;
Ghi chú: Để lập trình cần dùng một Cấu trúc đống cực tiểu
và một hàng đợi có ưu tiên
Trang 53Giả mã Giải thuật PRIM
6 for each v in Adj(u) do
7 if v ∈Q and Key(v) < w(u,v) then
8 Key(v):= w(u,v); Pre(v):=u;
Trang 54THUẬT TOÁN PRIM
Trang 55Ví dụ: Giải thuật PRIM
B
A
C D
9 12 9
8
11 9
Bổ sung loại bỏ
cạnh đươc xét Bổ sung cạnh sung Bổ
đỉnh
A AB,AC,AD,AF AB B
Trang 56Giải thuật PRIM (tiếp)
B
A
C D
9 12
9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12 9
8
11 9
B
A
C D
9 12
9
8
11 9
Trang 57THUẬT TOÁN PRIM
Lưu ý
Đối với mỗi đỉnh v, key[v] là trọng số nhỏ nhất của cạnh nối v với một đỉnh trong cây đang xây dựng
Ký hiệu π[v] biểu diễn cha của v trong cây đang xây dựng
Trong quá trình xây dựng , T luôn là một cây con của G Khi T chứa tất cả các đỉnh của G, T trở
thành cây bao trùm của G
Trang 58THUẬT TOÁN PRIM
Tổng thời gian cho tất cả các lần gọi MIN trong vòng lặp while là O(V lg V)
EXTRACT- Chi phí cho tất cả các lần lặp của vòng lặp for
8-11 trong vòng lặp while là O(E lg V)
Do đó, tổng chi phí là
O(V lg V + E lg V) = O(E lg V)
Trang 59Giải thuật trên đồ thị có hướng Tìm đường đi ngắn nhất
Các khái niệm
Thuật giải Dijkstra
Thuật giải Floyd-Warshall
Trang 60Các khái niệm
Trang 63Tìm đường đi ngắn nhất
Bài toánTìm các đường đi ngắn nhất từmột đỉnh s đến mọi đỉnh khác trong một đồthịcótrọng số
Trang 64Giải thuật DIJSKTRA
Trang 65Giải thuật DIJSKTRA
Trang 69 Tổng chi phí EXTRACT-MIN làO(VlgV)
Mỗi u được đưa vào S đúng một lần, mỗi cạnh
kề trong Adj[u] được kiểm tra đúng một lần, số lần kiểm tra tất cả các cạnh kề như vậy là |E|
Thời gian xử lý của RELAX là O(1)
Vậy tổng chi phí là O(V2+E)
Trang 70Giải thuật DIJSKTRA
Tổ chức dữ liệu
Với mỗi u∈ V(G), đặt L(u) là độ dài đường đi ngắn nhất từ s đến u, Pre(u) là đỉnh đứng trước đỉnh u trên đường đi ngắn nhất từ s đến u.
Gọi S là tập các đỉnh u đã được tính xong giá trị hàm
L(u);
Gọi Q là hàng đợi có ưu tiên gồm các đỉnh chưa tính xong L(u);
Trang 71Giải thuật DIJSKTRA- ngôn ngữ tự nhiên
1 {Khởi tạo}
Với mọi v∈V(G) đặt L(v):= +∞, Pre(u)=Null ; L(s):=0; Q:= {} (rỗng)
2 {Lặp: Mỗi bước tính xong L(u) của một đỉnh u}
2.1 Nếu mọi đỉnh của G đã nằm trong Q thì dừng.
2.2 Chọn đỉnh u có L(u) nhỏ nhất, chưa nằm trong S bổ sung vào S
Với mọi v ∈ Adj(u) {tính lại L(v)}
nếu L(v)> L(u)+W(u,v) thì đặt lại
L(v):= L(u)+W(u,v) ; Pre(v):=u;
Quay lại 2.1
Trang 72Giả mã giải thuật DIJSKTRA
Giả mã- Khởi tạo
Trang 73Giải thuật DIJSKTRA
Q là hàng đợi có ưu tiên với tiêu chuẩn Disk(u) nhỏ nhất;
ExtrackMin(Q) là thủ tục lấy phần tử có giá trị hàm Disk(u) nhỏ nhất khỏi Q
Trang 74Ví dụ: Dùng giải thuật DIJSKTRA
Tìm đường đi ngắn nhất từ A tới tất cả các
9 4 5
8
3 9
Trang 75Mô tả từng bước
B
A
C D
9 4 5
8
3 9
Trang 76THUẬT TOÁN
FLOYD-WARSHALL
Ý tưởng: Gọi P là đường đi ngắn nhất từ i đến j qua k đỉnh trung gian {1, 2,…, k-1, k} trong đồ thị G thì
Nếu đỉnh k ∈P thì P cóthể được chia làm 2 đường
đi ngắn nhất p1từ i đến k và P 2 từ k đến j đều đi qua k-1 đỉnh trung gian {1, 2, …, k-1}
Ngược lại P là đường đi ngắn nhất từ i đến j chỉ qua k-1 đỉnh{1, 2, …, k-1}
Trang 77THUẬT TOÁN
FLOYD-WARSHALL
Ý tưởng: Gọi P là đường đi ngắn nhất từ i đến j qua k đỉnh trung gian {1, 2,…, k-1, k} trong đồ thị G thì
Nếu đỉnh k ∈P thì P cóthể được chia làm 2 đường
đi ngắn nhất p1từ i đến k và P 2 từ k đến j đều đi qua k-1 đỉnh trung gian {1, 2, …, k-1}
Ngược lại P là đường đi ngắn nhất từ i đến j chỉ qua k-1 đỉnh{1, 2, …, k-1}
Trang 78THUẬT TOÁN WARSHALL
Trang 79THUẬT TOÁN WARSHALL
Trang 80THUẬT TOÁN WARSHALL
Trang 81FLOYD-Đọc thêm
Thomas H Cormen, Charles E Leiserson, Ronald D Rivest Introduction to Algorithms
Elementary Graph Algorithms
Minimum Spanning Trees
Single-Source Shortest Paths
All-Pairs Shortest Paths
Nguyễn Mạnh Tường
Các thuật toán trên đồ thị