Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 263 trang
THÔNG TIN TÀI LIỆU
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THÔNG TIN - 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 THS NGUYỄN MẠNH SƠN HÀ NỘI, 12/2020 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ụ 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 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, 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 toá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 toán Trong phần tài liệu, 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 2020 MỤC LỤC LỜI NÓI ĐẦU MỤC LỤC .i 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 1.2 Thuật toán số vấn đề liên quan .9 1.3 Biểu diễn thuật toán 10 1.4 Độ phức tạp thời gian thuật toán 11 1.4.1 Khái niệm độ phức tạp thuật toán 12 1.4.2 Một số qui tắc xác định độ phức tạp thuật toán 13 1.4.3 Một số dạng hàm dùng xác định độ phức tạp thuật toán 14 1.5 Độ phức tạp cấu trúc lệnh 15 1.6 Qui trình giải tốn máy tính 17 BÀI TẬP 18 CHƯƠNG MỘT SỐ LƯỢC ĐỒ THUẬT TOÁN KINH ĐIỂN 22 2.1 Mơ hình thuật tốn sinh (Generative Algorithm) 22 2.2 Mơ hình thuật tốn đệ qui (Recursion Algorithm) 28 2.3 Mơ hình thuật tốn quay lui (Back-track Algorithm) 30 2.4 Mơ hình thuật tốn tham lam (Greedy Algorithm) 37 2.5 Mơ hình thuật toán chia trị (Devide and Conquer Algorithm) 46 2.6 Mơ hình thuật tốn nhánh cận (Branch and Bound Algorithm) 47 2.7 Mơ hình thuật tốn qui hoạch động (Dynamic Programming Algorithm) 51 BÀI TẬP 54 CHƯƠNG SẮP XẾP VÀ TÌM KIẾM 59 3.1 Giới thiệu vấn đề 59 3.2 Các thuật toán xếp đơn giản 59 3.2.1 Thuật toán Selection-Sort 60 3.2.2 Thuật toán Insertion Sort 62 3.2.3 Thuật toán Bubble Sort 64 3.3 Thuật toán Quick Sort 66 3.4 Thuật toán Merge Sort 69 3.5 Thuật toán Heap Sort 73 3.6 Một số thuật toán tìm kiếm thơng dụng 75 3.6.1 Thuật tốn tìm kiếm tuyến tính (Sequential Serch) 75 3.6.2 Thuật tốn tìm kiếm nhị phân 76 3.6.3 Thuật tốn tìm kiếm nội suy 78 Nguyễn Duy Phương i 3.6.4 Thuật tốn tìm kiếm Jumping 80 BÀI TẬP 82 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 88 4.1 Danh sách liên kết đơn (Single Linked List) 88 4.1.1 Định nghĩa danh sách liên kết đơn 88 4.1.2 Biểu diễn danh sách liên kết đơn 88 4.1.3 Thao tác danh sách liên kết đơn 89 4.1.4 Ứng dụng danh sách liên kết đơn 104 4.2 Danh sách liên kết kép (double linked list) 105 4.2.1 Định nghĩa 105 4.2.2 Biểu diễn 105 4.2.3 Các thao tác danh sách liên kết kép 106 4.2.4 Xây dựng danh sách liên kết kép STL 114 4.3 Ngăn xếp (Stack) 117 4.3.1 Định nghĩa ngăn xếp 117 4.3.2 Biểu diễn ngăn xếp 118 4.3.3 Các thao tác ngăn xếp 118 4.3.4 Ứng dụng ngăn xếp 124 4.4 Hàng đợi (Queue) 128 4.4.1 Định nghĩa hàng đợi 128 4.4.2 Biểu diễn hàng đợi 129 4.4.3 Thao tác hàng đợi 129 4.4.4 Ứng dụng hàng đợi 138 BÀI TẬP 140 CHƯƠNG CÂY NHỊ PHÂN (BINARY TREE) 145 5.1 Định nghĩa khái niệm 145 4.1.1 Định nghĩa 145 5.1.2 Một số tính chất nhị phân 146 5.1.3 Các loại nhị phân 147 5.2 Biểu diễn nhị phân 151 5.2.1 Biểu diễn nhị phân mảng 151 5.2.2 Biểu diễn nhị phân danh sách liên kết 151 5.3 Các thao tác nhị phân 152 5.3.1 Định nghĩa khai báo nhị phân 152 5.3.2 Các thao tác thêm node vào nhị phân 153 5.3.3 Các thao tác loại node khỏi nhị phân 157 5.3.4 Ba phép duyệt nhị phân 160 5.3.5 Chương trình cài đặt thao tác nhị phân 162 5.4 Ứng dụng nhị phân 167 Nguyễn Duy Phương ii 5.5 Cây nhị phân tìm kiếm (Binary Search Tree) 167 5.5.1 Định nghĩa nhị phân tìm kiếm 167 5.5.2 Biểu diễn nhị phân tìm kiếm 168 5.5.3 Các thao tác nhị phân tìm kiếm 168 5.5.4 Chương trình cài đặt nhị phân tìm kiếm 172 5.6 Cây nhị phân tìm kiếm cân 176 5.6.1 Định nghĩa nhị phân tìm kiếm cân 176 5.6.2 Biểu diễn nhị phân tìm kiếm cân 177 5.6.3 Các thao tác nhị phân tìm kiếm cân 177 5.6.4 Chương trình cài đặt nhị phân tìm kiếm cân 184 BÀI TẬP 191 CHƯƠNG ĐỒ THỊ (GRAPH) 199 6.1 Định nghĩa khái niệm 199 5.1.1 Một số thuật ngữ đồ thị 199 6.1.2 Một số thuật ngữ đồ thị vô hướng 200 6.1.3 Một số thuật ngữ đồ thị có hướng 200 6.1.4 Một số loại đồ thị đặc biệt 201 6.2 Biểu diễn đồ thị 202 6.2.1 Biểu diễn ma trận kề 202 6.2.2 Biểu diễn đồ thị danh sách cạnh 203 6.2.3 Biểu diễn đồ thị danh sách kề 204 6.2.4 Biểu diễn đồ thị danh sách kề dựa vào danh sách liên kết 205 6.2.5 Biểu diễn đồ thị danh sách kề dựa vào list STL 208 6.3 Các thuật tốn tìm kiếm đồ thị 209 6.3.1 Thuật tốn tìm kiếm theo chiều sâu (Depth First Search) 209 6.3.2 Thuật tốn tìm kiếm theo chiều rộng (Breadth First Search) 213 6.3.3 Ứng dụng thuật toán DFS BFS 216 6.4 Đồ thị Euler 217 6.4.1 Thuật tốn tìm chu trình Euler đồ thị vô hướng 218 6.4.2 Thuật tốn tìm chu trình Euler đồ thị có hướng 221 6.4.3 Thuật toán tìm đường Euler đồ thị vơ hướng 225 6.4.4 Thuật tốn tìm đường Euler đồ thị có hướng 228 6.5 Bài toán xây dựng khung đồ thị 231 6.5.1 Xây dựng khung đồ thị thuật toán DFS 231 6.5.2 Xây dựng khung đồ thị thuật toán BFS 234 6.5.3 Xây dựng khung nhỏ đồ thị thuật toán Kruskal 237 6.5.4 Xây dựng khung nhỏ đồ thị thuật toán PRIM 241 6.6 Bài tốn tìm đường ngắn 244 6.6.1 Thuật toán Dijkstra 245 Nguyễn Duy Phương iii 6.6.2 Thuật toán Bellman-Ford 247 6.6.3 Thuật toán Floyd-Warshall 252 BÀI TẬP 255 TÀI LIỆU THAM KHẢO 261 Nguyễn Duy Phương iv 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 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: Tiếp cận tốn học ta nói nghiệm phương trình tập cặp (x, y) cho 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 tố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 tố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 tố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 1: Giới thiệu chung Kiểu liệu nguyên thủy (primitve data types) kiểu liệu định nghĩa hệ thống (system defined data type) gọi kiểu liệu nguyên thủy Thông thường, ngôn ngữ lập trình cung cấp ba kiểu liệu nguyên thủy ký tự (character), số (numberic), kiểu logic (bool) Kiểu liệu ký tự chia thành hai loại ký tự ASCII (char) ký tự unicode (wchar_t) Kiểu liệu số chia thành hai loại: số kiểu số nguyên (integer) kiểu số thực (real) Kiểu số nguyên chia thành ba loại: số nguyên nhỏ (int), số nguyên lớn (long), số nguyên lớn (long long) Kiểu số thực chia làm hai loại: số thực có độ xác đơn (float) số thực có độ xác kép (double) Dữ liệu kiểu bool định nghĩa hai giá trị (true) sai (false) Đương nhiên, hai từ khóa khác đại diện cho hai kiểu liệu khác Quan sát mang tính hình thức ta quan sát mắt Sự khác biệt bên kiểu liệu không gian nhớ dùng để biểu diễn kiểu phép toán dành cho biến thuộc kiểu Không gian nhớ dành cho kiểu phụ thuộc vào compiler ngôn ngữ lập trình hệ thống máy tính ta sử dụng Chẳng hạn, kiểu liệu int số compiler dùng byte biểu diễn, số complier dùng byte để biểu diễn Các phép toán lấy phần dư (modulo), dịch chuyển bít (bit operations) định nghĩa cho số int, long không định nghĩa cho số float double Để xác định độ lớn kiểu ta sử dụng hàm sizeof (tên kiểu) Ví dụ dùng để xác định không gian nhớ dành cho kiểu //Ví dụ 1.1 Xác định kích cỡ nhớ biểu diễn kiểu #include using namespace std; int main(void){ cout