1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giảng cấu trúc dữ liệu và giải thuật

228 105 0

Đ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

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THÔNG TIN -   PT IT BÀI GIẢNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Biên soạn : TS NGUYỄN DUY PHƯƠNG Hà Nội, tháng 12/2016 LỜI NÓI ĐẦU Cấu trúc liệu phương pháp biểu diễn đối tượng giới thực thành liệu tổ chức, lưu trữ máy tính để phục vụ q trình xử lý khai thác thông tin cách hiệu Thuật toán hiểu phương pháp xử lý thông tin hay liệu biểu diễn cấu trúc liệu cách nhanh Sự kết hợp cấu trúc liệu thuật toán cấu trúc liệu đem lại hiệu cao xây dựng ứng dụng Chính lý này, Cấu trúc liệu giải thuật xem môn học bắt buộc mang tính chất kinh điển ngành Công nghệ thông tin Điện tử Viễn thông Tài liệu giảng dạy môn Cấu trúc liệu giải thuật xây dựng dựa nội dung chương trình khung Học Viện Cơng Nghệ Bưu Chính Viễn Thơng ban hành IT Tài liệu trình bày thành chương Trong đó, Chương trình bày khái niệm định nghĩa cấu trúc liệu giải thuật Chương trình bày số mơ hình thuật tốn kinh điển ứng dụng Cơng nghệ Thơng tin Chương trình bày kỹ thuật xếp tìm kiếm Chương trình bày kiểu liệu tuyến tính (ngăn xếp, PT hàng đợi danh sách liên kết) Chương 5, trình bày cấu trúc liệu rời rạc (cây, đồ thị) Đối với với cấu trúc liệu, tài liệu tập trung trình bày bốn nội dung bản: định nghĩa, biểu diễn, thao tác ứng dụng cấu trúc liệu Ứng với thuật tốn, tài liệu trình bày bốn nội dung bản: biểu diễn, đánh giá, thử nghiệm cài đặt thuật tốn Trong phần tài liệu, chúng tơi cố gắng trình bày ngắn gọn trực tiếp vào chất vấn đề, đồng thời cài đặt thuật toán ngơn ngữ lập trình C++ nhằm đạt ba mục tiêu cho người học: làm chủ phương pháp biểu diễn liệu, nâng cao tư phân tích, thiết kế, đánh giá thuật tốn kỹ thuật lập trình thuật tốn Mặc dù cẩn trọng trình biên soạn, nhiên tài liệu khơng tránh khỏi thiếu sót hạn chế Chúng tơi mong góp ý q báu tất bạn đọc Hà nội, tháng 12 năm 2016 IT PT MỤC LỤC LỜI NÓI ĐẦU MỤC LỤC i DANH MỤC CÁC BẢNG iv DANH MỤC CÁC HÌNH vi CHƯƠNG GIỚI THIỆU CHUNG 1.1 Kiểu cấu trúc liệu 1.1.1 Kiểu liệu 1.1.2 Biến 10 1.2 Thuật toán số vấn đề liên quan 11 1.3 Biểu diễn thuật toán 12 1.4 Độ phức tạp thời gian thuật toán 13 1.4.1 Khái niệm độ phức tạp thuật toán 14 IT 1.4.2 Một số qui tắc xác định độ phức tạp thuật toán 15 1.4.3 Một số dạng hàm dùng xác định độ phức tạp thuật toán 16 1.5 Độ phức tạp cấu trúc lệnh 17 1.6 Qui trình giải tốn máy tính 19 BÀI TẬP 19 PT CHƯƠNG MỘT SỐ LƯỢC ĐỒ THUẬT TOÁN KINH ĐIỂN 20 2.1 Mơ hình thuật tốn sinh (Generative Algorithm) 20 2.2 Mơ hình thuật toán đệ qui (Recursion Algorithm) 26 2.3 Mơ hình thuật toán quay lui (Back-track Algorithm) 28 2.4 Mô hình thuật tốn tham lam (Greedy Algorithm) 35 2.5 Mơ hình thuật tốn chia trị (Devide and Conquer Algorithm) 42 2.6 Mơ hình thuật tốn nhánh cận (Branch and Bound Algorithm) 44 2.7 Mơ hình thuật tốn qui hoạch động (Dynamic Programming Algorithm) 47 BÀI TẬP 51 CHƯƠNG SẮP XẾP VÀ TÌM KIẾM 52 3.1 Giới thiệu vấn đề 52 3.2 Các thuật toán xếp đơn giản 52 3.2.1 Thuật toán Selection-Sort 53 3.2.2 Thuật toán Insertion Sort 55 3.2.3 Thuật toán Bubble Sort 57 3.3 Thuật toán Quick Sort 58 3.4 Thuật toán Merge Sort 61 3.5 Thuật toán Heap Sort 64 3.6 Một số thuật tốn tìm kiếm thơng dụng 67 3.6.1 Thuật tốn tìm kiếm tuyến tính (Sequential Serch) 67 Nguyễn Duy Phương i 3.6.2 Thuật tốn tìm kiếm nhị phân 68 3.6.3 Thuật tốn tìm kiếm nội suy 70 3.6.4 Thuật tốn tìm kiếm Jumping 71 BÀI TẬP 73 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 74 4.1 Danh sách liên kết đơn (Single Linked List) 74 4.1.1 Định nghĩa danh sách liên kết đơn 74 4.1.2 Biểu diễn danh sách liên kết đơn 74 4.1.3 Thao tác danh sách liên kết đơn 75 4.1.4 Ứng dụng danh sách liên kết đơn 90 4.2 Danh sách liên kết kép (double linked list) 91 4.2.1 Định nghĩa 91 4.2.2 Biểu diễn 91 4.2.3 Các thao tác danh sách liên kết kép 92 4.2.4 Xây dựng danh sách liên kết kép STL 100 IT 4.3 Ngăn xếp (Stack) 103 4.3.1 Định nghĩa ngăn xếp 103 4.3.2 Biểu diễn ngăn xếp 104 4.3.3 Các thao tác ngăn xếp 104 4.3.4 Ứng dụng ngăn xếp 110 PT 4.4 Hàng đợi (Queue) 113 4.4.1 Định nghĩa hàng đợi 113 4.4.2 Biểu diễn hàng đợi 114 4.4.3 Thao tác hàng đợi 114 4.4.4 Ứng dụng hàng đợi 123 BÀI TẬP 125 CHƯƠNG CÂY NHỊ PHÂN (BINARY TREE) 126 5.1 Định nghĩa khái niệm 126 4.1.1 Định nghĩa 126 5.1.2 Một số tính chất nhị phân 127 5.1.3 Các loại nhị phân 128 5.2 Biểu diễn nhị phân 131 5.2.1 Biểu diễn nhị phân mảng 131 5.2.2 Biểu diễn nhị phân danh sách liên kết 131 5.3 Các thao tác nhị phân 132 5.3.1 Định nghĩa khai báo nhị phân 132 5.3.2 Các thao tác thêm node vào nhị phân 133 5.3.3 Các thao tác loại node khỏi nhị phân 136 5.3.4 Ba phép duyệt nhị phân 140 Nguyễn Duy Phương ii 5.3.5 Chương trình cài đặt thao tác nhị phân 141 5.4 Ứng dụng nhị phân 147 5.5 Cây nhị phân tìm kiếm (Binary Search Tree) 147 5.5.1 Định nghĩa nhị phân tìm kiếm 147 5.5.2 Biểu diễn nhị phân tìm kiếm 148 5.5.3 Các thao tác nhị phân tìm kiếm 148 5.5.4 Chương trình cài đặt nhị phân tìm kiếm 151 5.6 Cây nhị phân tìm kiếm cân 155 5.6.1 Định nghĩa nhị phân tìm kiếm cân 155 5.6.2 Biểu diễn nhị phân tìm kiếm cân 156 5.6.3 Các thao tác nhị phân tìm kiếm cân 156 5.6.4 Chương trình cài đặt nhị phân tìm kiếm cân 162 BÀI TẬP 169 CHƯƠNG ĐỒ THỊ (GRAPH) 170 6.1 Định nghĩa khái niệm 170 IT 5.1.1 Một số thuật ngữ đồ thị 170 6.1.2 Một số thuật ngữ đồ thị vô hướng 171 6.1.3 Một số thuật ngữ đồ thị có hướng 171 6.1.4 Một số loại đồ thị đặc biệt 172 6.2 Biểu diễn đồ thị 173 PT 6.2.1 Biểu diễn ma trận kề 173 6.2.2 Biểu diễn đồ thị danh sách cạnh 174 6.2.3 Biểu diễn đồ thị danh sách kề 175 6.2.4 Biểu diễn đồ thị danh sách kề dựa vào danh sách liên kết 175 6.2.5 Biểu diễn đồ thị danh sách kề dựa vào list STL 178 6.3 Các thuật tốn tìm kiếm đồ thị 179 6.3.1 Thuật tốn tìm kiếm theo chiều sâu (Depth First Search) 179 6.3.2 Thuật toán tìm kiếm theo chiều rộng (Breadth First Search) 183 6.3.3 Ứng dụng thuật toán DFS BFS 186 6.4 Đồ thị Euler 187 6.4.1 Thuật tốn tìm chu trình Euler đồ thị vơ hướng 188 6.4.2 Thuật toán tìm chu trình Euler đồ thị có hướng 191 6.4.3 Thuật tốn tìm đường Euler đồ thị vô hướng 194 6.4.4 Thuật tốn tìm đường Euler đồ thị có hướng 197 6.5 Bài toán xây dựng khung đồ thị 200 6.5.1 Xây dựng khung đồ thị thuật toán DFS 201 6.5.2 Xây dựng khung đồ thị thuật toán BFS 204 6.5.3 Xây dựng khung nhỏ đồ thị thuật toán Kruskal 207 6.5.4 Xây dựng khung nhỏ đồ thị thuật toán PRIM 210 Nguyễn Duy Phương iii 6.6 Bài tốn tìm đường ngắn 213 6.6.1 Thuật toán Dijkstra 214 6.6.2 Thuật toán Bellman-Ford 216 6.6.3 Thuật toán Floyd-Warshall 221 BÀI TẬP 224 PT IT TÀI LIỆU THAM KHẢO 225 DANH MỤC CÁC BẢNG Bảng 2.1 Ma trận đánh giá lọc cộng tác Error! Bookmark not defined Bảng 2.2 Ma trận đặc trưng C Error! Bookmark not defined Bảng 2.3 Ma trận đặc trưng T Error! Bookmark not defined Bảng 2.4 Ma trận đánh giá,ví dụ 2.1 Error! Bookmark not defined Bảng 2.5.Ma trận đặc trưng Error! Bookmark not defined Bảng 2.6 Ví dụ 2.1 Giá trị Item(x,s) cho người dùng x Error! Bookmark not defined Bảng 2.7 Ví dụ 2.1- Ma trận đánh giá đặc trưng sản phẩm Error! Bookmark not defined Bảng 2.8 Ví dụ 2.1-Ma trận mở rộng Error! Bookmark not defined Bảng 2.9 Ví dụ 2.2- Ma trận đánh giá Error! Bookmark not defined Bảng 2.10 Ma trận đặc trưng Error! Bookmark not defined Bảng 2.11 Giá trị User(y,q) sản phẩm y Error! Bookmark not defined Bảng 2.12 Ma trận đánh giá sản phẩm đặc trưng người dùng Error! Bookmark not defined Bảng 2.13 Ví dụ 2.2- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.14 Ví dụ 2.3- Ma trận đẫu vào Error! Bookmark not defined Bảng 2.15 Ví dụ 2.4- Ma trận đầu vào Error! Bookmark not defined Bảng 2.16 Ví dụ 2.5- Ma trận đầu vào Error! Bookmark not defined Bảng 2.17 Ví dụ 2.6- ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.18 Ví dụ 2.7- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.19 Ví dụ 2.8- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.20 Ví dụ 2.9- Ma trận đánh giá Error! Bookmark not defined Nguyễn Duy Phương iv Bảng 2.21.Ma trận đặc trưng sản phẩm Error! Bookmark not defined Bảng 2.22 Ma trận đặc trưng người dùng Error! Bookmark not defined Bảng 2.23 Ví dụ 2.9- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.24 Ví dụ 2.9- Đầu ma trận đánh giá sau dự đoán Error! Bookmark not defined Bảng 2.25 Ví dụ 2.10-Ma trận đánh giá Error! Bookmark not defined Bảng 2.26 Ma trận đặc trưng sản phẩm Error! Bookmark not defined Bảng 2.27 Ma trận đặc trưng người dùng Error! Bookmark not defined Bảng 2.28 Ví dụ 2.10- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.29 Ví dụ 2.10- Ma trận đánh giá mở rộng Error! Bookmark not defined Bảng 2.30 Ví dụ 2.10- Ma trận đánh giá sau tư vấn Error! Bookmark not defined Bảng 3.1 Giá trị MAE phương pháp theo user thay đổi tập láng giềng Error! Bookmark not defined Bảng 3.2 Giá trị trung bình MAE phương pháp theo user thay đổi tập láng giềngError! Bookmark not defined Bảng 3.3 Giá trị MAE thay đổi giá trị  Error! Bookmark not defined Bảng 3.4 Giá trị trung bình MAE thay đổi giá trị  Error! Bookmark not defined Bảng 3.5 Giá trị MAE thay đổi α Error! Bookmark not defined Bảng 3.6 Giá trị trung bình MAE thay đổi α Error! Bookmark not defined Bảng 3.7 Giá trị MAE phương pháp theo item thay đổi giá trị tập láng giềng Error! Bookmark not defined Bảng 3.8 Giá trị trung bình MAE phương pháp theo item thay đổi giá trị tập láng giềng Error! Bookmark not defined IT Bảng 3.9 Giá trị MAE phương pháp theo item thay đổi giá trị  Error! Bookmark not defined PT Bảng 3.10 Giá trị MAE phương pháp theo item thay đổi giá trị  Error! Bookmark not defined Bảng 3.11 Giá trị MAE phương pháp theo item thay đổi giá trị α Error! Bookmark not defined Bảng 3.12 Giá trị trung bình MAE phương pháp theo item thay đổi giá trị α Error! Bookmark not defined Bảng 3.13 Phân bố số lượng đánh giá chung cặp người dùng Error! Bookmark not defined Bảng 3.14 Phân bố độ tương tự cặp người dùng Error! Bookmark not defined Bảng 3.15 Phân bố số lương đánh giá chung cặp sản phẩm Error! Bookmark not defined Bảng 3.16 Phân bố độ tương tự cặp sản phẩm Error! Bookmark not defined Bảng 3.17Giá trị MAE thay đổi số lượng đánh giá chung Error! Bookmark not defined Bảng 3.18 Giá trị MAE thay đổi số lượng đánh giá chung Error! Bookmark not defined Bảng 3.19 Giá trị MAE thay đổi u Error! Bookmark not defined Bảng 3.20 Giá trị MAE thay đổi u Error! Bookmark not defined Bảng 3.21 Giá trị MAE thay đổi i Error! Bookmark not defined Bảng 3.22 Giá trị MAE thay đổi i Error! Bookmark not defined Bảng 3.23 Giá trị MAE thay đổi βu Error! Bookmark not defined Bảng 3.24 Giá trị MAE thay đổi βu Error! Bookmark not defined Bảng 3.25 Giá trị MAE thay đổi βi Error! Bookmark not defined Bảng 3.26 Giá trị MAE thay đổi βi Error! Bookmark not defined Nguyễn Duy Phương v DANH MỤC CÁC HÌNH Hình 3.1Giá trị MAE phương pháp theo user thay đổi tập láng giềng Error! Bookmark not defined Hình 3.2 Giá trị MAE thay đổi giá trị  tính ma trận đánh giá đặc trưng sản phẩmError! Bookmark not defined Hình 3.3 Giá trị MAE thay đổi giá trị α Error! Bookmark not defined Hình 3.4 Giá trị MAE phương pháp theo item thay đổi giá trị tập láng giềng Error! Bookmark not defined Hình 3.5 Giá trị MAE phương pháp theo item thay đổi giá trị  Error! Bookmark not defined Hình 3.6 Giá trị MAE phương pháp theo item thay đổi giá trị α Error! Bookmark not defined Hình 3.7 Phân bố số lượng đánh giá chung cặp người dùng Error! Bookmark not defined Hình 3.8 Phân bố độ tương tự cặp người dùng Error! Bookmark not defined Hình 3.9 Phân bố số lương đánh giá chung cặp sản phẩm Error! Bookmark not defined Hình 3.10 Phân bố độ tương tự cặp sản phẩm Error! Bookmark not defined Hình 3.11 Giá trị MAE thay đổi số lượng đánh giá chung Error! Bookmark not defined Hình 3.12 Giá trị MAE thay đổi u Error! Bookmark not defined PT IT Hình 3.13 Giá trị MAE thay đổi i Error! Bookmark not defined Hình 3.14 Giá trị MAE thay đổi βu Error! Bookmark not defined Hình 3.15 Giá trị MAE thay đổi βi Error! Bookmark not defined Nguyễn Duy Phương vi Chương 1: Giới thiệu chung CHƯƠNG GIỚI THIỆU CHUNG Mục tiêu chương giải thích rõ tầm quan trọng việc phân tích thuật tốn với mối liên hệ ảnh hưởng qua lại liệu thuật toán Để thực điều này, khái niệm định nghĩa liệu, thuật tốn sau mở rộng sang vấn đề quan trọng độ phức tạp thuật tốn, độ phức tạp chương trình Cuối cùng, xem xét đến qui trình giải vấn đề khoa học máy tính thuật toán PT IT 1.1 Kiểu cấu trúc liệu Trước định nghĩa xác khái niệm kiểu liệu (data types), biến (variables) ta xem xét lại với ta biết trước tốn học Chẳng hạn ta giải phương trình: 𝑥 − 2𝑦 − = Tiếp cận tốn học ta nói nghiệm phương trình tập cặp (x, y) cho 𝑥 − 2𝑦 − = Ví dụ cặp (1, -1) nghiệm phương trình Tiếp cận tin học ta thấy phương trình có hai tên x y Nếu x y có giá trị tương ứng 1, -1 nghiệm phương trình Trong khoa học máy tính gọi x y hai biến giá trị x y gọi liệu Hai biến x y nhận giá trị miền khác Để giải phương trình ta cần phải xác định miền giá trị hai biến x y Ví dụ, x, y xác định miền số nguyên (10, 20, 30, ), số thực (0.23, 0.55,…) (0, 1) Để xác định miền giá trị biến, khoa học máy tính sử dụng từ khóa đại diện cho tập giá trị gọi kiểu liệu (a data type) Ta bắt đầu cách tổng quát hóa khái niệm theo cách tiếp cận khoa học máy tính 1.1.1 Kiểu liệu Kiểu liệu (a data type) tên hay từ khóa dùng để tập đối tượng liệu phép toán Ví dụ C++, từ khóa int dùng để tập số nguyên có độ lớn biểu diễn 2byte (tùy thuộc vào complier) với phép toán số học, phép toán so sánh, phép tốn cấp bít, phép tốn dịch chuyển bit Từ khóa float dùng để tập số thực có độ xác đơn có độ lớn biểu diễn 4byte (tùy thuộc vào complier) với phép toán số học, phép toán so sánh Khơng có phép lấy phần dư, phép tốn thao tác cấp bít với kiểu liệu float Kiểu liệu chia thành hai loại kiểu liệu hay gọi kiểu liệu nguyên thủy kiểu liệu người dùng định nghĩa Nguyễn Duy Phương CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT ba z ta thu phận gồm đỉnh cạnh Quá trình tiếp tục ta nhận gồm n-1 cạnh, bao trùm nhỏ cần tìm Thuật tốn Prim mơ tả Hình 5.17 a) Biểu diễn thuật tốn endwhile; IT Thuật toán PRIM (s): Begin: Bước (Khởi tạo): VH = {s}; //Tập đỉnh khung thiết lập ban đầu s V = V\{s}; //Tập đỉnh V bớt s T = ; //Tập cạnh khung thiết lập ban đầu  d(H) = 0; //Độ dài khung thiết lập Bước (Lặp ): while (V  ) { e = : cạnh có độ dài nhỏ thỏa mãn uV, vVH; d(H) = d(H) + d(e); // Thiết lập đồ dài khung nhỏ T = T  {e}; //Kết nạp e vào khung V = V \{u}; // Tập đỉnh V bớt đỉnh u VH = VH{u}; // Tập đỉnh VH thêm vào đỉnh u PT Bước (Trả lại kết quả): if (|T|dau>>cuoi>>w; //đọc cạnh (dau, cuoi, trongso) graph[dau][cuoi]=graph[cuoi][dau]=w; } fp.close(); primMST(graph,n); } 6.6 Bài tốn tìm đường ngắn Xét đồ thị G=; | V| = n, | E | = m Với cạnh (u, v)E, ta đặt tương ứng với số thực A[u][v] gọi trọng số cạnh Ta đặt A[u,v]= p (u, v)E Nếu dãy v0, v1, , vk đường G i 1 A[vi 1 , vi ] gọi độ dài đường Bài tốn tìm đường ngắn đồ thị dạng tổng qt phát biểu dạng sau: tìm đường ngắn từ đỉnh xuất phát sV (đỉnh nguồn) đến đỉnh cuối tV (đỉnh đích) Đường gọi đường ngắn từ s đến t, độ dài đường d(s,t) gọi khoảng cách ngắn từ s đến t (trong trường hợp tổng quát d(s,t) âm) Nếu không tồn đường từ s đến t độ dài đường d(s,t)= Dưới số thể cụ thể toán Trường hợp Nếu s cố định t thay đổi, tốn phát biểu dạng tìm đường ngắn từ s đến tất đỉnh cịn lại đồ thị Đối với đồ thị có trọng số khơng âm, tốn ln có lời giải thuật tốn Dijkstra Đối với đồ thị có trọng số âm khơng tồn chu trình âm, tốn có lời giải thuật tốn Bellman-Ford Trong trường hợp đồ thị có chu trình âm, tốn khơng có lời giải NGUYỄN DUY PHƯƠNG 213 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT Trường hợp Nếu s thay đổi t thay đổi, tốn phát biểu dạng tìm đường ngắn tất cặp đỉnh đồ thị Bài tốn ln có lời giải đồ thị khơng có chu trình âm Đối với đồ thị có trọng số khơng âm, tốn giải cách thực lặp lại n lần thuật toán Dijkstra Đối với đồ thị khơng có chu trình âm, tốn giải thuật tốn Floyd-Warshall 6.6.1 Thuật tốn Dijkstra Thuật tốn tìm đường ngắn từ đỉnh s đến đỉnh lại Dijkstra đề nghị áp dụng cho trường hợp đồ thị có hướng với trọng số khơng âm Thuật tốn thực sở gán tạm thời cho đỉnh Nhãn đỉnh cho biết cận độ dài đường ngắn tới đỉnh Các nhãn biến đổi (tính lại) nhờ thủ tục lặp, mà bước lặp số đỉnh có nhãn khơng thay đổi, nhãn độ dài đường ngắn từ s đến đỉnh Thuật tốn Dijkstra tìm đường ngắn từ s đến tất đỉnh lại đồ thị mơ tả chi tiết Hình 5.17 a) Biểu diễn thuật toán PT IT Thuật toán Dijkstra (s): //s V đỉnh G = Begin Bước (Khởi tạo): d[s]=0; //Gán nhãn đỉnh s T = V\{s}; // T tập đỉnh có nhãn tạm thời for each v V { //Sử dụng s gán nhãn cho đỉnh lại d[v] = A[s,v]; truoc[v]=s; endfor; Bước (Lặp): while (T  ) { Tìm đỉnh uT cho d[u] = { d[z] | zT}; T= T\{u}; //cố định nhãn đỉnh u for each v T { //Sử dụng u, gán nhãn laị cho đỉnh if ( d[v] > d[u] + A[u, v] ) then { d[v] = d[u] + A[u, v]; //Gán lại nhãn cho đỉnh v; truoc[v] = u; endif; endfor; endwhlie; Bước (Trả lại kết quả): Return (d[s], truoc[s]); End Hình 5.17 Thuật tốn Dijkstra NGUYỄN DUY PHƯƠNG 214 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT PT IT b) Độ phức tạp thuật toán Độ phức tạp thuật tốn O(V2), V số đỉnh đồ thị Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán Dijkstra tài liệu liên quan c) Thử nghiệm thuật toán Bạn đọc tự tìm hiểu phương pháp thử nghiệm thuật tốn Dijkstra tài liệu liên quan d) Cài đặt thuật toán #include #include #define MAX 100 using namespace std; //hàm tìm đỉnh có nhãn nhỏ int minDistance(int dist[], bool sptSet[], int n){ // thiết lập nhãn nhỏ ban đầu int = INT_MAX, min_index; for (int v = 1; v >cuoi>>trongso; graph[dau][cuoi]= trongso; graph[cuoi][dau]= trongso;//bỏ đồ thị có hướng } fp.close(); dijkstra(graph, 1, 9); } 6.6.2 Thuật tốn Bellman-Ford Thuật tốn Bellman-Ford dùng để tìm đường ngắn đồ thị khơng có chu trình âm Do vậy, thực thuật tốn Bellman-Ford ta cần kiểm tra đồ thị có chu trình âm hay khơng Trong trường hợp đồ thị có chu trình âm, tốn khơng có lời giải Thuật toán thực theo k = n - vòng lặp tập đỉnh tập cạnh tùy thuộc vào dạng biểu diễn đồ thị Nếu đồ thị biểu diễn dạng ma trận kề, độ phức tạp thuật toán O(V3), với V số đỉnh đồ thị Trong trường hợp đồ thị biểu diễn dạng danh sách cạnh, độ phức tạp thuật toán O(V.E), với V số đỉnh đồ thị, E số cạnh đồ thị Thuật toán mơ tả chi tiết Hình 5.18 cho đồ thị biểu diễn dạng ma trận kề NGUYỄN DUY PHƯƠNG 216 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT a) Biểu diễn thuật toán PT IT Thuật toán Bellman-Ford (s): //s V đỉnh đồ thị Begin: Bước (Khởi tạo): for vV { //Sử dụng s gán nhãn cho đỉnh vV D[v] = A[s][v]; Truoc[v] = s; } Bước (Lặp) : D[s] = 0; K=1; while (K D[u] + A[u][v] ) { D[v]= D[u] + A[u][v]; Truoc[v] = u; endif; endfor; endfor; endwlie; Bước (Trả lại kết quả): Return( D[v], Truoc[v]: vU); End Hình 5.18 Thuật toán Bellman-Ford b) Độ phức tạp thuật toán Độ phức tạp thuật tốn O(VE), V, E số đỉnh số cạnh đồ thị Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán Bellman-Ford tài liệu liên quan c) Thử nghiệm thuật tốn Bạn đọc tự tìm hiểu phương pháp thử nghiệm thuật toán Bellman-Ford tài liệu liên quan d) Cài đặt thuật toán #include #include #include #include #define MAX 100 #define MAXC 10000 NGUYỄN DUY PHƯƠNG 217 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT PT IT int C[MAX][MAX]; //Ma tran so bieu dien thi int D[MAX]; //Do dai duong di int Trace[MAX]; //Luu lai vet duong di int n, m, S, F; // n:So dinh; S: Dinh bat dau; F: Dinh ket thuc FILE *fp; void Read_Data(void){ int i, u, v;fp = fopen("dothi.in","r"); fscanf(fp,"%d%d%d%d",&n,&m,&S,&F); for(u=1; uedge[j].dest; int weight = graph->edge[j].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) dist[v] = dist[u] + weight; } } // Bước 3: kiểm tra chu trình âm for (int i = 1; i < E; i++) { int u = graph->edge[i].src; int v = graph->edge[i].dest; int weight = graph->edge[i].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { printf("Đồ thị có chu trình âm"); return; } } printArr(dist, V); } int main() { int V, E; // số đỉnh số cạnh đồ thị int dau, cuoi, trongso; ifstream fp("dothich.in"); //mở file đồ thị dạng danh sách cạnh fp>>V>>E;V=V; E=E; //đọc số đỉnh số cạnh Graph* graph = createGraph(V+1, E+1); //tạo đồ thị G= for(int i=1; i>dau>>cuoi>>trongso; graph->edge[i].src = dau; graph->edge[i].dest = cuoi; graph->edge[i].weight = trongso; } NGUYỄN DUY PHƯƠNG 220 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT fp.close(); BellmanFord(graph, 2); } 6.6.3 Thuật tốn Floyd-Warshall Để tìm đường ngắn tất cặp đỉnh đồ thị, sử dụng V lần thuật tốn Ford_Bellman Dijkstra (trong trường hợp trọng số không âm) Tuy nhiên, hai thuật toán sử dụng có độ phức tạp tính tốn lớn (chí O(V3)) Trong trường hợp tổng quát, người ta thường dùng thuật tốn FloydWarshall Thuật tốn Floy mơ tả chi tiết Hình 5.19 a) Biểu diễn thuật tốn PT IT Thuật toán Floyd-Warshall: Begin: Bước (Khởi tạo): for (i=1; i n; i++) { for (j =1; j n; j++) { d[i,j] = a[i, j]; p[i,j] = i; } } Bước (lặp) : for (k=1; k n; k++) { for (i=1; i n; i++){ for (j =1; j n; j++) { if (d[i,j] > d[i, k] + d[k, j]) { d[i, j] = d[i, k] + d[k, j]; p[i,j] = p[k, j]; } } } } Bước (Trả lại kết quả): Return (p([i,j], d[i,j]: i, jV); Hình 5.19 Thuật tốn Floyd-Warshall b) Độ phức tạp thuật toán NGUYỄN DUY PHƯƠNG 221 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT PT IT Độ phức tạp thuật tốn O(V3), V số đỉnh đồ thị Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán Floyd-Warshall tài liệu liên quan c) Kiểm nghiệm thuật toán Bạn đọc tự tìm hiểu phương pháp kiểm nghiệm thuật tốn Floyd-Warshall tài liệu liên quan d) Cài đặt thuật toán #include #include #include #define MAX 10000 #define TRUE #define FALSE int A[50][50], D[50][50], S[50][50]; int n, u, v, k;FILE *fp; void Init(void){ int i, j, k; fp=fopen(“FLOY.IN”,”r”); if(fp==NULL){ printf(“\n Khong co file input”); getch(); return; } for(i=1; i

Ngày đăng: 19/03/2021, 16:45

Xem thêm:

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN