Môn : Phân tích thiết kế giải thuật-GVHD: Trần Tuấn Anh Trường ĐẠI HỌC GIAO THÔNG VẬN TẢI THÀNH PHỐ HỒ CHÍ MINH Chủ đề: Phân tích độ phức tạp thuật toán Floyd-Warshall... Phân tích độ
Trang 1Môn : Phân tích thiết kế giải thuật-GVHD:
Trần Tuấn Anh
Trường ĐẠI HỌC GIAO
THÔNG VẬN TẢI THÀNH PHỐ HỒ CHÍ MINH
Chủ đề: Phân tích độ phức tạp thuật toán
Floyd-Warshall
Trang 2Nguyễn Việt Long
Trần Đông Dung
Nguyễn Trọng Nhân
Thành Viên nhóm 9:
Trang 3THUẬT TOÁN FLOYD-WARSHALL
Trang 41 Tìm hiểu về Floyd-Warshall
2 Code mẫu- phân tích cách hoạt động
3 Phân tích độ phức tạp giải thuật
FLOYD-WARSHALL
Trang 5Trong những bài toán đường đi ngắn nhất mà chúng ta cần thông tin về đường đi giữa nhiều cặp đỉnh, ta có xu hướng là sẽ tính toán đường
đi ngắn nhất giữa mọi cặp đỉnh
Thuật toán Floyd-Warshall là một thuật toán phù hợp để thực hiện tác vụ này
Ý TƯỞNG
Trang 6 Thuật toán Floyd-Warshall còn được gọi là thuật toán Floyd được Robert Floyd tìm ra năm 1962 Thuật toán Floyd là một thuật toán giải quyết bài toán đường đi
ngắn nhất trong một đồ thị có hướng có cạnh mang
trọng số dương dựa trên khái niệm các Đỉnh Trung Gian.
Thuật toán Floyd-Warshall giúp xác định tất cả các
Đường đi ngắn nhất giữa tất cả các cặp đỉnh.
Định lý: Thuật toán Floyd-Warshall cho ta Ma trận W* =
Wn là ma trận Khoảng cách nhỏ nhất của đồ thị G.
KHÁI NIỆM
Trang 7Ma trận trọng điểm của đồ thị
Trang 8Cho đồ thị:
Trang 9Từ đồ thị ta chuyển thành ma trận A
Tạo một ma trận có chiều trong đó n là số đỉnh. i và j là các đỉnh của đồ thị
Mỗi ô A [i] [j] được lấp đầy bởi khoảng cách từ đỉnh
đến đỉnh. Nếu không có đường đi từ đỉnh đến đỉnh, ô được để
là vô cùng.
Trang 10Với k = 1
Các phần tử trong cột đầu tiên và hàng đầu tiên được giữ nguyên.
k la đỉnh trung gian trong đường đi ngắn nhất từ nguồn đến đích
Với k =1 là đỉnh đầu tiên, ta tính đỉnh nguồn đến đích thông qua đỉnh k này, A[i][j] được lấp đầy bởi:
(A[i][k] + A[k][j]) if (A[i][j] > A[i][k] + A[k][j])
Ta có A0 ở bước trước
Trang 11Tương tự, A2 được tạo bằng A1 Các phần tử trong cột thứ hai và hàng thứ hai được giữ nguyên.
Với k = 2
Trang 12K =3
K =4
Trang 13ĐỘ PHỨC TẠP CỦA FLOYD-WARSHALL
Trang 14 void PrintMatran(void){
cout << "Ma tran: \n";
for (int i = 0; i < n; i++){
N*N N*N N*N
N
= 1 + (N+1) + N*(N+1) + 4*N*N + N
= 5*N 2 + 3*N + 2
Trang 15 if (A[i][k] + A[k][j] < A[i][j])
A[i][j] = A[i][k] + A[k][j];
N*N*N
5*N 2 + 3*N + 2
Gọi T(n) là thời gian thực hiện chương trình T(n)= 1 + (N+1)
+ N*(N+1) + N*N*(N+1) +2* N*N*N + 5*N 2 + 3*N + 2
= 3*N 3 + 7*N 2 + 5*N + 4
Độ phức tạp của
thuật toán :
O(n 3 ) (Độ phức tạp không Gian: 0(n^2) )
Trang 16 Ưu điểm:
Không cần chạy lại Thuật toán (có nghĩa là có tính kế thừa từ đường đi lẫn nhau)
Có thể chạy được với trọng số âm.
Nhược điểm: Chi phí cao O(n^3) cho mỗi cặp đỉnh
Ưu và Nhược điểm
Floyd-Warshall
Trang 17Để tìm đường đi ngắn nhất là đồ thị có hướng
Để tìm cách đóng theo hướng bắc cầu của đồ thị có hướng
Để tìm Nghịch đảo của ma trận thực
Để kiểm tra xem một biểu đồ vô hướng có
phải là lưỡng phân hay không
Ứng dụng
Trang 18So sánh giữa 2 thuật toán dijkstra và Warshall
Floyd-Dijsktra
Floyd-Warshall
Ưu điểm Chi phí thấp hơn
Thuật toán Warshall
Floyd-Không cần chạy lại
Thuật toán (có nghĩa
là có tính kế thừa từ đường đi lẫn nhau)Có thể chạy được với trọng số âm
Nhược điểm Không chạy được với
trọng số âm. Chi phí cao {\displaystyle
O(n^{3})} cho mỗi cặp đỉnh
Trang 19CODE:
Trang 201 Thuật toán Floyd-Warshall có độ phức tạp là bao nhiêu?
2 Ứng dụng của thuật toán Floyd-Warshall
3 Ưu và nhược điểm của thuật toán
Floy-Warshall
Câu hỏi:
Trang 21THANKS