Một số mô tả cho một vài giải thuật cơ bản: sắp xếp, tìm kiếm. Sắp xếp gồm có 5 loại cơ bản là: quick sort, merge sort có độ phức tạp là nlog n nhưng nó cải thiện tốt hơn 2 giải thuật còn lại là bubble sort, insertion sort và selection sort với độ phức tạp lên đến n2. Ngoài ra tài liệu còn giới thiệu 2 giải thuật cơ bản trong việc tìm kiếm phần tử trong một kiểu tập cấu trúc của dữ liệu.
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 PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT BÀI TẬP LỚN Người hướng dẫn: Thầy NGUYỄN CHÍ THIỆN Người thực hiện: NGUYỄN DUY HÀN LÂM (MSSV: 51403229) Lớp : 14050301 Khoá THÀNH PHỐ HỒ CHÍ MINH, NĂM 2014 TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM : 18 TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT BÀI TẬP LỚN Người hướng dẫn: Thầy NGUYỄN CHÍ THIỆN Người thực hiện: NGUYỄN DUY HÀN LÂM (MSSV: 51403229) Lớp : 14050301 Khoá THÀNH PHỐ HỒ CHÍ MINH, NĂM 2014 : 18 BÀI TẬP LỚN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG Tôi xin cam đoan sản phẩm tập lớn riêng hướng dẫn Thầy Nguyễn Chí Thiện 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, tập lớ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 xin hoàn toàn chịu trách nhiệm nội dung tập lớ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 trình thực (nếu có) TP Hồ Chí Minh, ngày 18 tháng năm 2016 Tác giả (ký tên ghi rõ họ tên) Nguyễn Duy Hàn Lâm 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) MỤC LỤC DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ DANH MỤC HÌNH, BẢNG BIỂU CHƯƠNG 1: BÀI TOÁN SẮP XẾP Sắp xếp toán lĩnh vực khoa học máy tính toán học Được sử dụng cho thuật toán phức tạp toán xếp lịch trình, tìm đường đi, theo giải thuật tham lam Ngoài toán xếp yếu tố quan để phục vụ cho toán thực tế đơn giản xếp liệu tổ chức, công ty, Vì giới hạn đề tài nên tài liệu xin đề cập giải thuật xếp theo mục cụ thể sau Bài toán xếp thật chất việc so sánh phần tử tập liệu theo quy tắc định (tăng dần, giảm dần, theo thứ tự bảng chữ cái, ) sau hoán đổi vị trí phần tử tập liệu cho phần tử tập liệu từ không quy tắc trở thành tập liệu theo quy tắc đề 1.1 Selection Sort 1.1.1 Ý tưởng Ý tưởng việc xếp chọn (Selection Sort) việc phần tử tập liệu ta tìm tiếp xem phần tử nhỏ nhỏ mảng phần tử ta lưu lại vị trí phần tử đặc biệt hoán đổi vị trí phần tử duyệt với phần tử tìm 8 1.1.2 Giải thuật Algorithm SelectionSort(array A[0 n-1]) Integer = For (integer i = to n -1) 1) = i 2) for (integer j = i + to n – 1) a) if(A[min]>A[j]) = j b) end if 3) end for 4) if(A[min] != A[i]) a) swap(A[min], A[j]) // hoán đổi phần tử A[min] A[j] 5) end if end for end Algorithm 1.1.3 Cài đặt thuật toán Xem file code chung với tập tài liệu 1.1.4 Độ phức tạp Giải thuật phải tốn chi phí lớn công đoạn nằm vòng lặp thứ (bước 2.2)a) ) nên ta có sau: Đối với i = Thì vòng lặp phải chạy (n – 1) – + = n – lần công đoạn Thì vòng lặp phải chạy (n – 1) – + = n – lần công đoạn Thì vòng lặp phải chạy (n – 1) – + = n – lần công đoạn (n – 1) Thì vòng lặp phải chạy (n – 1) – (n – 1) + = lần công đoạn Do ta có: Vậy thuật toán có độ phức tạp 1.1.5 Nhận xét So với Insertion Sort Bubble Sort trình bày bên Selection Sort có thời gian chạy thực tế nhanh (mặc dù Insertion Sort Bubble Sort có độ phức tạp (trình bày lí mục phía dưới)) Selection Sort phải tốn thời gian cho số lần hoán đổi Insertion Sort Bubble Sort 1.2 Bubble Sort 1.2.1 Ý tưởng Ý tưởng phương hoán đổi vị trí phần tử mảng phần tử mảng có vị trí thứ tự theo yêu cầu 1.2.2 Giải thuật Algorithm BubbleSort(array A[0 n-1]) For (integer i = to n – 1) 1) For (integer j = n – to i + 1) a) If(A[i]>A[j]) • Swap(A[i], A[j]) b) End if 2) End for End for End Algorithm 1.2.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 1.2.4 Độ phức tạp Ta dễ dàng thấy thao tác bước 1.1)a) ta được: Khi i = 10 Thì vòng lặp phải chạy n – - + = (n – 1) thao tác Thì vòng lặp phải chạy n – – + = (n – 2) thao tác Thì vòng lặp phải chạy n – – + = (n – 3) thao tác (n – 1) Thì vòng lặp phải chạy (n – 1) – (n – 1) + = thao tác Do ta có: Vậy thuật toán có độ phức tạp 1.2.5 Nhận xét Về phương diện lý thuyết, ta thấy bubble sort có độ phức tạp nhiên công đoạn swap bubble sort phải thực gọi hàm nhiều lần mà công đoạn hoán vị phần tử tốn dòng lệnh selection sort tốn dòng để lưu vị trí số hoán đổi bubble sort nên Bubble sort có thời gian chạy thực tế lâu Selection Sort Insertion Sort 1.3 Insertion Sort 1.3.1 Ý tưởng Dùng mốc duyệt phần tử phía mốc trở trước phần tử dồn lên cho trật tự mà tập liệu đề Và phần tử bị đè chèn vào vị trí thích hợp cho trật tự 11 1.3.2 Giải thuật Algorithm InsertionSort(array A[0 n – 1]) For (integer i = to n – 1) 1) Integer value = A[i] 2) Integer j = i - 3) While (j ≥ and A[j] > value) a) A[j + 1] = A[j] b) j = j – 4) end while 5) A[j + 1] = value End for End Algorithm 1.3.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 1.3.4 Độ phức tạp Trong trường hợp xấu vòng while phải dồn phần tử liên tục Trong trường hợp ta có: Vậy thuật toán có độ phức tạp 1.3.5 Nhận xét Tuy nhiên giải thuật thường không hoán vị nhiều bubble sort có trường hợp chạy nhanh gần selection sort Tóm lại đơn vị phức tạp ta nên chọn theo thứ tự selection sort, insertion sort, bubble sort thời gian thực thi thực tế giảm dần (càng chậm dần) giải thuật 1.4 Merge Sort 1.4.1 Ý tưởng 12 Giải thuật có điểm độc đáo chỗ ta chia nhỏ tập liệu ban đầu thành nhiều tập liệu mà tập liệu có phần tử sau hoán vị (hoặc không) phần tử cho trật tự yêu cầu Sau trộn (gộp) tất tập liệu thành tập liệu tập liệu tạo nên có trật tự yêu cầu chúng gộp từ tất tập liệu trật tự 1.4.2 Giải thuật Procedure Merge(array left[0 x – 1], array right[0 y – 1], array A[0 n – 1]) Integer i, j, k i = j = k = while (i < (x – 1) and j < (y – 1)) 1) if(left[i] right[j]) 13 a) A[k] = right[j] b) j = j + 4) end if 5) k = k + end while while(i < x – 1) 1) A[k] = left[i] 2) i = i + 3) k = k + end while while(j < y – 1) 1) A[k] = right[j] 2) j = j + 3) k = k + end while End Producer Algorithm MergeSort(array A[0 n – 1]) Integer s = size of A If (s > 1) 1) Integer mid = s/2; 2) Array left, Array right 14 3) For (integer i = to mid - 1) a) Left[i] = A[i] 4) End for 5) For (integer i = mid to s – 1) b) Right[i] = A[i] 6) End for 7) MergeSort(left) 8) MergeSort(right) 9) Merge(left, right, A) End if End Algorithm 1.4.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 1.4.4 Độ phức tạp Ta dễ dàng thấy tập liệu có phần tử giải thuật không làm Còn có nhiều tập liệu chia thành tập liệu hàm gộp (có độ phức tạp n chạy từ phần tử cuối tập liệu gốc) từ ta thu hệ thức truy hồi sau: Ta có: a = 2; b = f(n) = n Theo định lý Master ta thu giải thuật có độ phức tạp 1.4.5 Nhận xét Trong trường hợp xấu merge sort trì trạng thái so với Quick sort nhiên Merge Sort lại tốn nhiều không gian lưu trữ chậm phải tốn chi phí gọi hàm thao tác gộp 15 Tuy quick sort trường hợp xấu Quick sort lại tốt so với trường hợp trung bình việc chọn lựa Quick Sort hay Merge Sort phải tùy vào trạng thái liệu đầu vào kiến trúc máy tính xử lý thao tác 1.5 Quick Sort 1.5.1 Ý tưởng Ý tưởng giải thuật xếp nhanh (Quick Sort) chọn phần tử mảng làm phần tử chốt (phần tử gốc) để đem so sánh với phần tử khác mảng Sau phần tử nhỏ nằm bên trái phần tử lớn phần tử chốt nằm bên phải (đối với trường hợp cụ thể xếp tập phần tử tăng dần) 1.5.2 Giải thuật Procedure Quick(array A[0 n-1], integer left_position, integer right_position) Integer x = A[0] Integer i = left_position + Integer j = right_position Do{ 1) While(i≤j and A[i]≤x) a) i = i + 2) end while 3) while(i≤j and A[j]>x) a) j = j – 4) end while 5) if(i≤j) a swap(A[i],A[j]) //hoán đổi phần tử vị trí thứ i j cho b) i = i + c) j = j – 16 6) end if }while(i≤j); Swap(A[left_position],A[j]) //hoán đổi phần tử cuối dừng lại vòng while với phần tử chốt return j; end Procedure Algorithm QuickSort(array A[0 n-1], integer left_position, integer right_position) If(left_position ≤ right_postion) 1) Integer vt = Quick(A, left_position, right_position) 2) QuickSort(A, left_position, vt – 1) 3) QuickSort(A, vt + 1, right_position) End if End Algorithm 1.5.3 Cài đặt thuật toán Xem file code chung với tập tài liệu 1.5.4 Độ phức tạp Ở bước 1.1) phần mã giả có độ phức tạp n bước toán gọi đệ quy lấy nửa phần tử mảng truyền vào để thực thi nên ta 2T(n/2) Từ ta thiết lập hệ thức hồi quy sau: Ta có: a = 2; b = f(n) = n Theo định lý Master ta thu giải thuật có độ phức tạp 1.5.5 Nhận xét Tuy bất lợi so với Merge Sort trường hợp xấu bù lại quick sort lại có lợi nhớ độ xác cao so với merge sort nên việc chọn lựa 17 quick sort merge sort phải tùy theo trường hợp đầu vào mà định thuật toán 1.6 Nhận xét chung Đối với Selection Sort, Bubble Sort Insertion Sort ta nên áp dụng cho liệu đầu vào nhỏ đủ để xử lý giải thuật dễ hiểu viết chương trình Tuy nhiên để nâng cao tốc độ chương trình với tập liệu đầu vào lớn ta nên dùng Quick Sort Merge Sort chúng có độ phức tạp thấp nhiều (đã chứng minh trên) Việc sử dụng Merge Sort hay Quick Sort phải phụ thuộc vào nhiều yếu tố tập liệu đầu vào, kiến trúc máy tính, CHƯƠNG 2: BÀI TOÁN TÌM KIẾM 2.1 Tìm kiếm (Sequential Search) 2.1.1 Ý tưởng Đơn giản so sánh phần tử tập liệu xem phần tử giống với phần tử cần tìm trả kết vị trí phần tử mảng không thấy trả kết -1 tương ứng liệu cần tìm mảng 2.1.2 Giải thuật Algorithm SequentialSearch(array A[0 n – 1], finding_info) For (integer i = to n – 1) 1) If (A[i] = finding_info) a) Return i 2) End if End for Return -1 End Algorithm 2.1.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 2.1.4 Độ phức tạp 18 Ta dễ dàng thấy có vòng lặp duyệt từ phần tử tập liệu phần tử cuối tập liệu Do ta thu giải thuật có độ phức tạp 2.2 Tìm kiếm nhị phân (Binary Search) 2.2.1 Ý tưởng Giải thuật có ý tưởng tìm kiếm tập liệu đầu vào ĐÃ SẮP XẾP có trật tự (tăng dần giảm dần) nhờ ta bỏ qua phần duyệt phần tử không cần thiết mảng Giúp làm giảm thời gian tìm kiếm Không tìm thấy phần tử trả kết -1 2.2.2 Giải thuật Note: Array A has been sorted Algorithm BinarySearch(array A[0 n – 1], finding_info) Integer mid = Integer left = Integer right = n – While (left ≤ right) 1) Mid = (left + right) / 2) If (A[mid] = finding_info) a) Return mid 3) End if 4) If(finding_info < A[mid]) a) Right = mid – 5) End if 6) If(finding_info > A[mid]) a) Left = mid + 7) End if End while Return -1 End Algorithm 19 2.2.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 2.2.4 Độ phức tạp Ta giả sử tập liệu đầu vào xếp nên không cần tính độ phức tạp phần mục xếp Ta thấy bước 4.1) ta vô tình chia cách vô hình tập liệu thành phần phần tử tập liệu liệu cần tìm trả vị trí (mid) (trường hợp tốt Ω(1)) Nếu không bước sau 4.4)a) 4.6)a) ta dịch chuyển left right sang vị trí việc ta vô tình chia tập thành phần chia tìm thấy liệu dừng việc chia gặp điều kiện dừng vòng while Do đó, ta được: T(n) = n = Giải phương trình ta được: (1) Phương trình ngừng khi: T(n) = n = Thế vào (1) ta được: Vậy giải thuật có độ phức tạp 2.3 Cây nhị phân tìm kiếm (Binary Search Tree) 2.3.1 Ý tưởng Dùng cấu trúc liệu nhị phân để lưu trữ tìm kiếm tập liệu 2.3.2 Giải thuật Algorithm BinarySearchTree( root, finding_info) If (root = null) • Return -1 End if 20 If(root.data = finding_info) • Return root.place //vị trí phần tử End if If (finding_info < root.data) • Return BinarySearchTree(root.left, finding_info) End if If (finding_info > root.data) • Return BinarySearchTree(root.right, finding_info) End if End Algorithm 2.3.3 Cài đặt giải thuật Xem file code chung với tập tài liệu 2.3.4 Độ phức tạp Ở liệu đầu vào không cần xếp chúng theo cấu trúc nhị phân Tìm kiếm theo quy luật nên cần duyệt nửa số phần tử (do liệu cần tìm nhỏ liệu nút gốc duyệt qua trái lớn duyệt qua phải) ta có: T(n) = n = Giải phương trình ta được: (1) Phương trình ngừng khi: T(n) = n = Thế vào (1) ta được: Vậy giải thuật có độ phức tạp [...]... Vậy thuật toán có độ phức tạp là 1.3.5 Nhận xét Tuy nhiên giải thuật này thường không hoán vị nhiều như bubble sort và có trường hợp chạy nhanh hoặc gần bằng selection sort Tóm lại trong cùng một đơn vị phức tạp là ta nên chọn theo thứ tự là selection sort, insertion sort, bubble sort vì đó là thời gian thực thi thực tế giảm dần (càng chậm dần) của các giải thuật 1.4 Merge Sort 1.4.1 Ý tưởng 12 Giải thuật. .. liệu Do đó ta thu được giải thuật có độ phức tạp là 2.2 Tìm kiếm nhị phân (Binary Search) 2.2.1 Ý tưởng Giải thuật này có ý tưởng tìm kiếm trên một tập dữ liệu đầu vào ĐÃ được SẮP XẾP có trật tự (tăng dần hoặc giảm dần) nhờ đó ta có thể bỏ qua phần duyệt các phần tử không cần thiết trong mảng Giúp làm giảm thời gian tìm kiếm Không tìm thấy phần tử thì trả kết quả là -1 2.2.2 Giải thuật Note: Array A has... Quick Sort 1.5.1 Ý tưởng Ý tưởng của giải thuật sắp xếp nhanh (Quick Sort) đó là chọn một phần tử trong mảng làm phần tử chốt (phần tử gốc) để đem đi so sánh với các phần tử khác trong mảng Sau đó những phần tử nào nhỏ hơn sẽ nằm bên trái và những phần tử nào lớn hơn phần tử chốt thì nằm bên phải (đối với trường hợp cụ thể là sắp xếp tập phần tử tăng dần) 1.5.2 Giải thuật Procedure Quick(array A[0 n-1],... kiện dừng của vòng while Do đó, ta được: và T(n) = 0 khi n = 1 Giải phương trình trên ta được: (1) Phương trình ngừng khi: T(n) = 0 khi n = 1 Thế vào (1) ta được: Vậy giải thuật có độ phức tạp là 2.3 Cây nhị phân tìm kiếm (Binary Search Tree) 2.3.1 Ý tưởng Dùng cấu trúc dữ liệu cây nhị phân để lưu trữ và tìm kiếm tập dữ liệu 2.3.2 Giải thuật Algorithm BinarySearchTree( root, finding_info)... 2.3.3 Cài đặt giải thuật Xem ở file code đi chung với tập tài liệu này 2.3.4 Độ phức tạp Ở đây dữ liệu đầu vào không cần sắp xếp vì chúng đã theo cấu trúc cây nhị phân Tìm kiếm ở đây đã theo quy luật của cây nên chỉ cần duyệt một nửa số phần tử của cây (do nếu dữ liệu cần tìm nhỏ hơn dữ liệu ở nút gốc thì duyệt qua trái còn nếu lớn hơn thì duyệt qua phải) do đó ta có: và T(n) = 0 khi n = 1 Giải phương... nếu không thấy thì trả ra kết quả -1 tương ứng dữ liệu cần tìm không có trong mảng 2.1.2 Giải thuật Algorithm SequentialSearch(array A[0 n – 1], finding_info) 1 For (integer i = 0 to n – 1) do 1) If (A[i] = finding_info) a) Return i 2) End if 2 End for 3 Return -1 4 End Algorithm 2.1.3 Cài đặt giải thuật Xem ở file code đi chung với tập tài liệu này 2.1.4 Độ phức tạp 18 Ta có thể dễ dàng... Right[i] = A[i] 6) End for 7) MergeSort(left) 8) MergeSort(right) 9) Merge(left, right, A) 3 End if 4 End Algorithm 1.4.3 Cài đặt giải thuật Xem ở file code đi chung với tập tài liệu này 1.4.4 Độ phức tạp Ta sẽ dễ dàng thấy được khi tập dữ liệu chỉ có 1 phần tử thì giải thuật sẽ không làm gì cả Còn có nhiều hơn 1 thì tập dữ liệu sẽ chia thành 2 tập dữ liệu con và 1 hàm gộp (có độ phức tạp là n do chạy...11 1.3.2 Giải thuật Algorithm InsertionSort(array A[0 n – 1]) 1 For (integer i = 1 to n – 1) do 1) Integer value = A[i] 2) Integer j = i - 1 3) While (j ≥ 0 and A[j] > value) do a) A[j + 1] = A[j] b) j = j – 1 4) end while 5) A[j + 1] = value 2 End for 3 End Algorithm 1.3.3 Cài đặt giải thuật Xem ở file code đi chung với tập tài liệu này 1.3.4 Độ... Algorithm 1.5.3 Cài đặt thuật toán Xem ở file code đi chung với tập tài liệu này 1.5.4 Độ phức tạp Ở bước 1.1) ở phần mã giả ở trên có độ phức tạp là n và ở bước 2 và 3 bài toán được gọi đệ quy nhưng chỉ lấy một nửa phần tử của mảng truyền vào để thực thi nên ta được 2T(n/2) Từ đó ta thiết lập được hệ thức hồi quy sau: Ta có: a = 2; b = 2 và f(n) = n Theo định lý Master ta thu được giải thuật có độ phức tạp... xác cao so với merge sort nên việc chọn lựa 17 giữa quick sort và merge sort phải tùy theo trường hợp đầu vào mà quyết định thuật toán 1.6 Nhận xét chung Đối với Selection Sort, Bubble Sort và Insertion Sort ta chỉ nên áp dụng cho dữ liệu đầu vào nhỏ đủ để xử lý mặc dù các giải thuật này dễ hiểu và viết chương trình Tuy nhiên để nâng cao tốc độ của chương trình với tập dữ liệu đầu vào lớn ta nên dùng