Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 62 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
62
Dung lượng
4,98 MB
Nội dung
TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CUỐI KÌ MƠN PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT Người hướng dẫn: GV TRẦN LƯƠNG QUỐC ĐẠI Người thực hiện: NGUYỄN THỊ HUYỀN TRANG – 51800825 NGUYỄN VĂN PHƯỚC – 51800803 TRẦN THU HỒNG – 51800775 THÀNH PHỐ HỒ CHÍ MINH, NĂM 2020 h TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THƠNG TIN BÁO CÁO CUỐI KÌ MƠN PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT Người hướng dẫn: GV TRẦN LƯƠNG QUỐC ĐẠI Người thực hiện: NGUYỄN THỊ HUYỀN TRANG – 51800825 NGUYỄN VĂN PHƯỚC – 51800803 TRẦN THU HỒNG – 51800775 THÀNH PHỐ HỒ CHÍ MINH, NĂM 2020 h i LỜI CẢM ƠN Đầu tiên, chúng xin gửi lời cảm ơn đến giảng viên mơn Phân tích thiết kế giải thuật – thầy Trần Lương Quốc Đại tồn thể thầy khoa Cơng nghệ thơng tin tận tình giúp đỡ chúng em trình học tập thực báo cáo Trong thời gian tìm hiểu học tập mơn này, chắn chúng em cịn nhiều thiếu sót chưa thể hiểu rõ tất kiến thức liên quan đến phân tích thiết kế giải thuật Do đó, q trình thực báo cáo có chỗ cịn thiếu sót, chúng em mong thầy bỏ qua góp ý để chúng em hồn thiện báo cáo Chúng em xin chân thành cảm ơn! h ii ĐỒ ÁN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG Chúng tơi xin cam đoan sản phẩm đồ án riêng hướng dẫn GV Trần Lương Quốc Đại; Các nội dung nghiên cứu, kết đề tài trung thực chưa công bố hình thức trước Những số liệu bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá tác giả thu thập từ nguồn khác có ghi rõ phần tài liệu tham khảo Ngoài ra, đồ án sử dụng số nhận xét, đánh số liệu tác giả khác, quan tổ chức khác có trích dẫn thích nguồn gốc Nếu phát có gian lận chúng tơi xin hồn tồn chịu trách nhiệm nội dung đồ án Trường đại học Tôn Đức Thắng không liên quan đến vi phạm tác quyền, quyền gây q trình thực (nếu có) TP Hồ Chí Minh, ngày tháng năm Tác giả (ký tên ghi rõ họ tên) Nguyễn Thị Huyền Trang Nguyễn Văn Phước Trần Thu Hồng h iii PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN Phần xác nhận GV hướng dẫn _ _ _ _ _ _ _ Tp Hồ Chí Minh, ngày tháng năm (kí ghi họ tên) Phần đánh giá GV chấm _ _ _ _ _ _ _ Tp Hồ Chí Minh, ngày tháng năm (kí ghi họ tên) h iv TĨM TẮT Mơn Phân tích thiết kế giải thuật giới thiệu khái niệm, kỹ thuật phân tích độ phức tạp thuật toán, giới thiệu số kỹ thuật thiết kế thuật toán thiết kế trực tiếp (brute-force), chia để trị (divide-and-conquer), kỹ thuật tham lam (greedy technique), quy hoạch động (dynamic programming) Môn học ứng dụng kỹ thuật để thiết kế, cài đặt thuật tốn cho ứng dụng máy tính Chúng ta đánh giá hiệu ứng dụng dựa lý thuyết phân tích dựa việc thực thi thực tế chương trình máy tính Sau hồn thành xong mơn Phân tích thiết kế giải thuật này, cung cấp kiến thức kỹ việc phân tích độ phức tạp tính toán giải thuật h MỤC LỤC LỜI CẢM ƠN i PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN iii TÓM TẮT iv MỤC LỤC DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ CHƯƠNG – BRUTE FORCE (THUẬT TOÁN TRỰC TIẾP) 1.1 Giới thiệu .7 1.2 Ví dụ 1.2.1 Selection Sort (Sắp xếp chọn) 1.2.1.1 Ý tưởng thuật toán 1.2.1.2 Mơ tả thuật tốn .8 1.2.1.3 Triển khai python 1.2.2 Bubble Sort (Sắp xếp bọt) 1.2.2.1 Ý tưởng thuật toán 1.2.2.3 Triển khai python 11 1.2.3 Sequential Search (Tìm kiếm tuần tự) .11 1.2.3.1 Ý tưởng thuật toán 11 1.2.3.2 Mô tả thuật toán .11 1.2.3.3 Triển khai python .12 CHƯƠNG – DIVDE-AND-CONQUER 12 2.1 Giới thiệu 12 2.2 Ví dụ 13 2.2.1 Merge Sort 13 2.2.1.1 Ý tưởng thuật toán 13 2.2.1.2 Mơ tả thuật tốn .15 2.2.1.3 Triển khai python .15 h 2.2.2 Quick Sort 17 2.2.2.1 Ý tưởng thuật toán 17 2.2.2.2 Mô tả thuật toán .17 2.2.2.3 Triển khai python .18 2.2.3 Binary Tree Traversals and Related Properties 19 2.2.3.1 Ý tưởng thuật toán 19 2.2.3.2 Mô tả thuật toán .20 2.2.3.3 Triển khai python .20 CHƯƠNG – GREEDY ALGORITHMS (THUẬT TOÁN THAM LAM) 21 3.1 Giới thiệu 21 3.2 Ví dụ 23 3.2.1 Dijkstra’s Algorithm (Tìm đường ngắn đồ thị có trọng số) 23 3.2.1.1 Ý tưởng thuật toán 23 3.2.1.2 Mô tả thuật toán .23 3.2.1.3 Triển khai python .26 3.2.2 Prim’s Algorithm 28 3.2.2.1 Ý tưởng thuật toán 28 3.2.2.2 Mô tả thuật toán .29 3.2.2.3 Triển khai python .31 3.2.3 Huffman Trees and Codes 32 3.2.3.1 Ý tưởng thuật toán 32 3.2.3.2 Mơ tả thuật tốn .33 3.2.3.3 Triển khai python .33 CHƯƠNG – DYNAMIC PROGRAMMING 36 4.1 Giới thiệu 36 4.2 Ví dụ 36 h 4.2.1 Coin-row problem (Bài toán hàng đồng xu) 36 4.2.1.1 Ý tưởng thuật toán 36 4.2.1.2 Mô tả thuật toán .37 4.2.1.3 Triển khai python .37 4.2.2 Change-making problem (Bài toán tạo thay đổi) 38 4.2.2.1 Ý tưởng thuật toán 38 4.2.2.2 Mô tả thuật toán .39 4.2.2.3 Triển khai python .39 4.2.3 Coin-collecting problem 40 4.2.3.1 Ý tưởng thuật toán 40 4.2.3.2 Mô tả thuật toán .40 4.2.3.3 Triển khai python .41 CHƯƠNG – TRANSFORM-AND-CONQUER .42 5.1 Presorting (Sắp xếp trước) 42 5.1.1 Ý tưởng thuật toán .42 5.1.2 Mơ tả thuật tốn 43 5.1.3 Triển khai python .44 5.2 Gaussian Elimination (Phép loại trừ Gaus) 44 5.2.1 Ý tưởng thuật toán .44 5.2.2 Mơ tả thuật tốn 45 5.2.3 Triển khai python .46 5.3 Balanced Search Trees (Cây tìm kiếm cân bằng) .46 5.3.1 Ý tưởng thuật toán .46 5.3.2 Mô tả thuật toán 51 5.3.3 Triển khai python .51 5.4 Heaps and Heapsort 52 5.4.1 Ý tưởng thuật toán .52 h 5.4.2 Mô tả thuật toán 52 5.4.3 Triển khai python .53 5.5 Horner’s Rule and Binary Exponentiation 53 5.5.1 Ý tưởng thuật toán .53 5.5.2 Mơ tả thuật tốn 56 5.5.3 Triển khai python .56 5.6 Problem Reduction (Giảm thiểu vấn đề) 56 5.6.1 Ý tưởng thuật toán .56 5.6.2 Mơ tả thuật tốn 57 5.6.3 Triển khai python .57 h 42 // Giải vấn đề tính phần tử cách xếp mảng trước // Đầu vào: Một mảng A [0 n - 1] gồm phần tử xếp thứ tự // Kết quả: Trả "true" A khơng có phần tử nhau, "false" không for i ← to n − if A[i] = A[i + 1] return false return true Thời gian chạy thuật toán tổng thời gian dành cho việc xếp thời gian dành cho việc kiểm tra phần tử liên tiếp Vì phần trước u cầu n log n phép so sánh phần sau cần không n-1 phép so sánh, nên phần xếp xác định hiệu tổng thể thuật tốn Vì vậy, sử dụng thuật tốn xếp bậc hai đây, tồn thuật tốn khơng hiệu thuật tốn brute-force Nhưng sử dụng thuật toán xếp tốt, chẳng hạn merge sort, với hiệu suất trường hợp xấu (n log n), hiệu trường hợp xấu tồn thuật tốn dựa xếp trước (n log n): T (n) = Tsort(n) + Tscan(n) ∈θ(n log n) +θ(n) = θ(n log n) 5.1.3 Triển khai python def Isequal(A): for i in range(len(A)-1): if A[i] == A[i+1]: return False return True 5.2 Gaussian Elimination (Phép loại trừ Gaus) 5.2.1 Ý tưởng thuật toán Cho hệ phương trình gồm n phương trình với n ẩn số h 43 a11 x1 a12 x2 a1n xn b1 a21 x1 a22 x2 a2 n xn b2 ; ; an 1x1 an x2 ann xn bn Để giải hệ phương trình trên, ta dùng giải thuật loại trừ Gauss (Gauss elimination) Ý tưởng: biến đổi hệ thống n phương trình tuyến tính với n biến thành hệ thống tương đương (tức có lời giải hệ phương trình ban đầu) với ma trận tam giác (một ma trận với hệ số zero đường chéo chính) Giải thuật Gauss thể tinh thần chiến lược biến thể - để - trị theo kiểu “đơn giản hóa thể hiện” (instance simplification) ' a11' x1 a12 x2 a1' n xn b1' a11 x1 a12 x2 a1 n xn b1 a '22 x2 a'2n xn b2' a21 x1 a22 x2 a2 n xn b2 ; ; an x1 an x2 ann xn bn => a 'nnx n b 'n Làm cách để ta chuyển hệ thống với ma trận A thành hệ thống trương đương với ma trận tam giác A’? Bằng loạt phép biến đổi sau: - Hốn vị hai phương trình hệ thống - Thay phương trình phương trình nhân với hệ số - Thay phương trình với tổng hay hiệu phương trình với phương trình khác nhân hệ số Ví dụ : Giải hệ phương trình thuật tốn loại trừ Gauss h 44 Chúng ta giải cách thay ngược lại x ( 2) / x2 (3 ( 3) x3 ) / 0 and x1 (1 x ( 1)x ) / 1 , , 5.2.2 Mô tả thuật toán //ForwardElimination(A[1 n,1 n],b[1 n]) // Áp dụng loại bỏ Gaussian cho ma trận A hệ số hệ thống, // tăng cường với vectơ b giá trị bên phải hệ thống // Đầu vào: Ma trận A [1 n, n] vectơ cột b [1 n] // Đầu ra: Một ma trận tam giác tương đương thay cho A với // giá trị bên phải tương ứng cột st (n + 1) for i ← to n A[i, n + 1]← b[i] for i ← to n − for j ← i + to n for k ← i to n + A[j, k]←A[j, k]−A[i, k] *A[j, i]/A[i,i] 5.2.3 Triển khai python def ForwardElimination(A,b): n = len(A) for i in range(n-1): h 45 A[i][n+1]=b[i] for i in range(n): for j in range(i+1,n): for k in range(i,n+1): A[j][k] = A[j][k]-A[I][k]*A[j][i]/A[i][i] 5.3 Balanced Search Trees (Cây tìm kiếm cân bằng) 5.3.1 Ý tưởng thuật toán Chúng ta thảo luận tìm kiếm nhị phân Nó nhị phân có nút chứa phần tử tập hợp mục xác định được, phần tử nút, cho tất phần tử bên trái nhỏ phần tử gốc tất phần tử bên phải lớn Các nhà khoa học máy tính dành nhiều nỗ lực việc cố gắng tìm cấu trúc trì đặc tính tốt tìm kiếm nhị phân cổ điển Họ đưa hai cách tiếp cận Cách tiếp cận đa dạng đơn giản hóa ví dụ: tìm kiếm nhị phân khơng cân chuyển đổi thành cân Bởi điều này, gọi tự cân Các cách triển khai cụ thể ý tưởng khác theo định nghĩa chúng cân Một AVL yêu cầu khác biệt chiều cao bên trái bên phải nút không vượt Một màu đỏ-đen cho phép chiều cao lớn gấp đôi chiều cao nút Nếu việc chèn xóa nút tạo có yêu cầu số dư bị vi phạm, cấu trúc lại số phép biến đổi đặc biệt gọi phép quay khôi phục số dư cần thiết Trong phần này, thảo luận AVL Cách tiếp cận thứ hai đa dạng thay đổi biểu diễn: cho phép nhiều phần tử nút tìm kiếm Những trường hợp cụ thể 2-3, 2-3-4 Trong phần này, thảo luận câu 2-3 h 46 - Cây AVL Định nghĩa: Một AVL tìm kiếm nhị phân, yếu tố cân nút, định nghĩa chênh lệch độ cao bên trái bên phải nút, +1 - (Chiều cao trống định nghĩa - Tất nhiên, hệ số cân tính hiệu số số cấp chênh lệch độ cao bên trái bên phải nút.) Ví dụ, tìm kiếm nhị phân Hình 6.2a AVL Hình 6.2b khơng Hình 5.1 Nếu việc chèn nút làm cho AVL không cân bằng, biến đổi phép quay Một phép quay AVL phép biến đổi cục bắt nguồn từ nút có số dư trở thành +2 −2 Nếu có số nút vậy, xoay gốc nút không cân nút gần với chèn Bốn phép quay: single R-rotation, single L-rotation, double LR-rotation double RL-rotation thể h 47 Hình 5.2 h 48 - Cây 2-3 Như đề cập trên, ý tưởng thứ hai để cân tìm kiếm cho phép nhiều khóa nút Cách triển khai đơn giản ý tưởng 2-3 Cây 2-3 có hai loại nút: nút nút Một nút chứa khóa K có hai nút con: nút bên trái đóng vai trị gốc có khóa nhỏ K nút bên phải đóng vai trị gốc có khóa lớn K (Trong nói cách khác, nút loại nút mà có tìm kiếm nhị phân cổ điển.) Một nút chứa hai khóa có thứ tự K1 K2 (K1