1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đánh giá các thuật toán sort

31 516 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

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 573,5 KB

Nội dung

Đánh giá các thuật toán sort

BỘ MÔN KHOA HỌC MÁY TÍNH ………………………………………………………… Đồ án Nhập Môn Phân Tích Độ Phức Tạp Thuật Toán Đề tài: Đánh giá thuật toán Sort Giảng viên hướng dẫn lý thuyết TS Trần Đan Thư Giảng viên hướng dẫn thực hành Dương Chí Nhân TP.HCM, tháng 05 năm 2010 MỞ ĐẦU Đề tài nhóm đánh giá độ phức tạp giải thuật xếp Nói đến giải thuật xếp có lẽ chủ đề quen thuộc kinh điển Tuy nhiên, xem quen thuộc nên thường hay quên Mục tiêu đề tài để nắm lại tư tưởng thuật toán xếp, độ phức tạp mặt lý thuyết, nữa, thực nghiệm đánh giá, kiểm chứng lại độ phức tạp Nội dung phần báo cáo chia làm phần lớn:  Nền tảng lý thuyết: Giới thiệu tổng quan tư tưởng, độ phức tạp thuật toán xếp  Thực nghiệm: Nêu lên cách tiến hành thực nghiệm, kết nhận xét Page Các thuật toán Sort MỤC LỤC MỞ ĐẦU MỤC LỤC .3 Chương NỀN TẢNG LÝ THUYẾT 1.1 SELECTION SORT 1.1.1 Ý tưởng thuật toán 1.1.2 Ví dụ minh họa 1.1.3 Độ phức tạp 1.2 INTERCHANGE SORT 1.2.1 Ý tưởng thuật toán 1.2.2 Ví dụ minh họa 1.2.3 Độ phức tạp 11 1.3 BUBBLE SORT .12 1.3.1 Ý tưởng thuật toán 12 1.3.2 Ví dụ minh họa .12 Cho dãy số thuật toán SELECTION SORT .12 1.3.3 Độ phức tạp 13 1.4 SHAKER SORT 14 1.4.1 Ý tưởng thuật toán 14 1.4.2 Ví dụ minh họa .14 1.4.3 Độ phức tạp 14 1.5 INSERTION SORT .14 1.5.1 Ý tưởng thuật toán 14 1.5.2 Ví dụ minh họa .15 1.5.3 Độ phức tạp 16 1.6 BINARY INSERTION SORT 17 1.6.1 Ý tưởng thuật toán 17 1.6.2 Ví dụ minh họa .17 1.6.3 Độ phức tạp 17 1.7 HEAP SORT 18 1.7.1 Ý tưởng thuật toán 18 Page Các thuật toán Sort 1.7.2 Ví dụ minh họa .18 1.7.3 Độ phức tạp 20 1.8 MERGE SORT 21 1.8.1 Ý tưởng thuật toán 21 1.8.2 Ví dụ minh họa .21 1.8.3 Độ phức tạp 22 1.9 BINARY TREE 23 1.9.1 Ý tưởng thuật toán 23 1.9.2 Ví dụ minh họa .24 1.9.3 Độ phức tạp 26 1.10 QUICK SORT .27 1.10.1 Ý tưởng thuật toán .27 1.10.2 Ví dụ minh họa .27 1.10.3 Độ phức tạp 28 1.11 SHELL SORT 29 1.11.1 Ý tưởng thuật toán 29 1.11.2 Ví dụ minh họa 29 1.11.3 Độ phức tạp 30 Chương THỰC NGHIỆM 31 2.1 PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH THỰC NGHIỆM 31 2.2 KẾT QUẢ THỰC NGHIỆM 31 Chương ĐÁNH GIÁ ĐỀ TÀI .31 TÀI LIỆU THAM KHẢO 31 Chương NỀN TẢNG LÝ THUYẾT Page Các thuật toán Sort 1.1 SELECTION SORT 1.1.1 Ý tưởng thuật toán  Ta chọn phần tử nhỏ N phần tử ban đầu, đưa phần tử đầu dãy hành Sau đó, ta không quan tâm đến nữa, ta xem dãy hành N-1 phần tử dãy ban đầu tính từ vị trí thứ Cứ vậy, dãy hành phần tử, ta dãy tăng  Các bước tiến hành sau: o Bước 1: Khởi động i = o Bước 2: Tìm phần tử nhỏ a[min] dãy hành từ a[i] đến a[N] o Bước 3: Hoán vị a[min] a[i] o Bước 4: i = i+1  Nếu i < =N-1: quay trở lại bước  Ngược lại: STOP! 1.1.2 Ví dụ minh họa Cho dãy số 12 Hình minh họa cho trình xếp dãy số trên: Page Các thuật toán Sort 15 D Dãy xếp tăng 1.1.3 Độ phức tạp Để chọn phần tử nhỏ nhất, ta cần duyệt qua n phần tử (tốn n-1 phép so sánh) sau hoán vị với phần tử dãy hành Để tìm phần tử nhỏ tiếp theo, ta cần duyệt qua n-1 phần tử (tốn n-2 phép so sánh) Cứ vậy, ta thấy thuật toán tốn (n-1) + (n-2) + … + = n(n-1)/2 = O(n 2) phép so sánh Page Các thuật toán Sort Mỗi lần duyệt, ta phải hoán vị lần (1 hoán vị tương đương với phép gán), nghĩa thuật toán tốn 3(n-1) + 3(n-2) + … + = 3n(n-1)/2 = O(n2) phép gán Tổng kết lại, ta có độ phức tạp thuật toán Selection Sort thuộc O(n 2) trường hợp 1.2 INTERCHANGE SORT 1.2.1 Ý tưởng thuật toán  Ý tưởng thuật toán ta tìm cặp nghịch triệt tiêu chúng Ta xuất phát từ phần tử dãy, tìm tất các cặp nghịch chứa phần tử này, triệt tiêu chúng hoán vị phần tử với phần tử tương ứng cặp nghịch Ta dễ nhận thấy sau lần duyệt đầu tiên, phần tử phần tử nhỏ dãy Ta tiếp tục xử lý với phần tử thứ hai, ta có phần tử thứ hai phần tử nhỏ thứ hai dãy Cứ vậy, sau xử lý với phần tử thứ N -1 dãy, ta dãy tăng  Các bước tiến hành sau: o Bước 1: Khởi động i = o Bước 2: j = i+1 o Bước 3: Trong j a[j]: Hoán vị a[i] a[j]  j = j+1 o Bước 4: i = i+1  Nếu i = a[2*i] a[i] >= a[2*i+1] (i=1…n/2) (Điều kiện cho xếp tăng dần)  Như ta thấy gốc heap phần tử lớn nhất, ta rút trích phần tử gốc xây dựng lại heap bị rút trích ta có mảng có thứ tự tăng dần  Giải thuật: o Bước 1: Xây dựng heap từ mảng ban đầu o Bước 2: Hoán vị phần tử đầu cuối mảng, giảm dần số phần tử mảng xuống thành n-1 (bỏ phần tử cuối) o Bước 3: Tiếp tục xây dựng hoán vị hết ta có dãy thứ tự tăng dần (muốn giảm dần ta chi cần cho phần tử gốc heap phần tử nhỏ nhất) 1.7.2 Ví dụ minh họa Cho dãy số a: 12 Giai đoạn 1: hiệu chỉnh dãy ban đầu thành heap Page 18 Các thuật toán Sort 15 Giai đoạn 2: Sắp xếp dãy số dựa heap: Page 19 Các thuật toán Sort Thực tương tự cho r = 5, 4, 3, ta được: 1.7.3 Độ phức tạp  Ta thấy chi phí cho xây dựng heap thêm vào heap phần tử log2n (chính chiều cao heap cho lần làm chìm phần tử xuống vị trí thích hợp), mặt khác từ bước đến bước ứng với phần tử ta xây dựng lại heap lần, mà ta có n phần tử Vậy ta ước tính chi phí cho xếp Page 20 Các thuật toán Sort HeapSort O(nlogn) cho trường hợp (Từ thực nghiệm cài đặt cho kết ~ 4log2n) 1.8 MERGE SORT 1.8.1 Ý tưởng thuật toán  Cho dãy ban đầu a1, a2, …, an Ta coi tập hợp liên tiếp dãy có thứ tự Ta gọi dãy có thứ tự dãy  Trong phương pháp Merge Sort, vấn đề ta tìm cách phân hoạch dãy ban đầu thành dãy Sau phân hoạch xong, dãy ban đầu tách thành hai dãy phụ theo nguyên tắc phân phối luân phiên dãy Sau đó, ta trộn cặp dãy hai dãy phụ thành dãy dãy ban đầu Ta nhận thấy số dãy dãy ban đầu lúc giảm nửa Cứ sau số bước, ta nhận dãy ban đầu với số dãy 1, có nghĩa ta xếp xong  Trộn trực tiếp: phương pháp trộn đơn giản Việc phân hoạch dãy ban đầu đơn giản sau: Với dãy ban đầu có n phân tử, ta phân hoạch thành n dãy Vì dãy có phần tử nên dãy có thứ tự Cứ lần tách – trộn, chiều dài dãy nhân đôi  Các bước tiến hành: o Bước 1: Khởi động k = //Với k chiều dài dãy o Bước 2: Phân phối dãy a = a1, a2, …, an vào hai dãy phụ b, c theo nguyên tắc phân phối luân phiên dãy b = a1, …, ak, a2k+1, …, a3k, … c = ak+1, …, a2k, a3k+1, …, a4k o Bước 3: Từ dãy phụ b, c, ta trộn cặp dãy đưa vào dãy a o Bước 4: k = k*2  Nếu kvalue < treeNode->value) InsertNode(treeNode->left, newNode); else InsertNode(treeNode->right, newNode); }  Duyệt nhị phân tìm kiếm : sau hoàn thành việc tạo dựng nhị phân tìm kiếm Các nút duyệt theo thứ tự cách gọi đệ quy bên trái, in nút duyệt, duyệt đệ qui bên phải, tiếp tục làm vây với nút trình đệ qui (theo thứ tự LNR) if node == NULL return traverse_binary_tree(node->leftChild, callback); callback(node->value); traverse_binary_tree(node->rightChild, callback); Page 23 Các thuật toán Sort 1.9.2 Ví dụ minh họa Duyệt theo thứ tự LNR : Cho sau : Thứ tự phép duyệt LNR : CBEDFAKHL Ví dụ cụ thể : Cho dãy sau : 44 55 12 42 94 18 67 Khi insert vào ta sau : + Bước : + Bước : Page 24 Các thuật toán Sort + Bước : + Bước : + Bước : + Bước : Page 25 Các thuật toán Sort + Bước : + Bước : Sau hoàn tất cần duyệt theo phép LNR dãy số có thứ tự 1.9.3 Độ phức tạp  Độ phức tạp thuật toán sort phụ thuộc vào hàm hàm chèn phần tử duyệt hết phần tử  Đối với hàm chèn phần tử : ta thấy thời gian chạy tỉ lệ thuận với chiều cao -> trường hợp xấu mảng sắp, tiêu tốn Ω (n), O(log n) trường hợp trung bình  Đối với hàm duyệt phần tử: luôn đạt độ phức tạp tính toán O(n), phải duyệt qua tất nút Page 26 Các thuật toán Sort 1.10 QUICK SORT 1.10.1 Ý tưởng thuật toán  QuickSort chia mảng thành hai danh sách cách so sánh phần tử danh sách với phần tử chọn gọi phần tử chốt Những phần tử nhỏ phần tử chốt đưa phía trước nằm danh sách thứ nhất, phần tử lớn chốt đưa phía sau thuộc danh sách thứ hai Cứ tiếp tục chia tới danh sách có độ dài  Sau lượt phân hoạch ta có: o V0 … Vj < x, phân hoạch tiếp V0… Vj o Vj+1 Vi-1 = x o Vi … Vn-1 > x, phân hoạch tiếp Vi… Vn-1 1.10.2 Ví dụ minh họa Cho dãy số a: 12 Phân hoạch đoạn l =1, r = 8: x = A[4] = Phân hoạch đoạn l =1, r = 3: x = A[2] = Page 27 Các thuật toán Sort 15 Phân hoạch đoạn l = 5, r = 8: x = A[6] = Phân hoạch đoạn l = 7, r = 8: x = A[7] = 1.10.3 Độ phức tạp Ta nhận thấy hiệu thuật toán phụ thuộc vào việc chọn giá trị mốc (hay phần tử chốt)  Trường hợp tốt nhất: lần phân hoạch ta chọn phần tử median (phần tử lớn hay nửa số phần tử nhỏ hay nửa số phần tử lại) làm mốc Khi dãy phân hoạch thành hai phần nhau, ta cần log2(n) lần phân hoạch xếp xong Ta dễ nhận thấy lần phân hoạch ta cần duyệt qua n phần tử Vậy độ phức tạp trường hợp tốt thuộc O(nlog2(n))  Trường hợp xấu nhất: lần phần hoạch ta chọn phải phần tử có giá trị cực đại cực tiểu làm mốc Khi dãy bị phân hoạch thành hai phần không đều: phần có phần tử, phần lại có n-1 phần tử Do đó, ta cần tới n lần phân hoạch xếp xong Vậy độ phức tạp trường hợp xấu thuộc O(n2) Tổng kết lại, ta có độ phức tạp Quick Sort sau: Page 28 Các thuật toán Sort  Trường hợp tốt nhất: O(nlog2(n))  Trường hợp xấu nhất: O(n2)  Trường hợp trung bình: O(nlog2(n)) 1.11 SHELL SORT 1.11.1 Ý tưởng thuật toán  Là giải thuật cải tiến từ Insertion sort Ý tưởng thuật toán phân chia dãy ban đầu thành dãy mà phần tử dãy cách vị trí h Insertion sort áp dụng sau dãy làm cho phần tử đưa vị trí tương đối (trong dãy con) cách nhanh chóng  Sau tiếp tục giảm khoảng cách h để tạo thành dãy (Tạo điều kiện để so sánh phần tử với nhiều phần tử khác trước không dãy với nó) lại tiếp tục xếp  Thuật toán dừng h = 1, lúc bảo đảm tất phần tử dãy ban đầu so sánh với để xác định trật tự cuối 1.11.2 Ví dụ minh họa Cho dãy số a: 12 Giả sử chọn khoảng cách 5, 3, h = 5: xem dãy ban đầu dãy h = 3: (sau xếp dãy bước trước) h = 1: (sau xếp dãy bước trước) Page 29 Các thuật toán Sort 15 1.11.3 Độ phức tạp Yếu tố định thuật toán cách chọn khoảng cách h bước xếp số bước xếp k Nhưng phải thỏa điều kiện sau: - hi > hi + - hk =  Các phần tử h không bội số nhằm tránh tượng bước thứ tự phải tổ hợp nhóm mà bước trước chúng ảnh hưởng lẫn Điều mong muốn ảnh hưởng nhóm khác nhiều tốt  Việc đánh giá giải thuật Shell sort phức tạp, chí số chưa chứng minh Nhưng có điều chắn hiệu thuật toán phụ thuộc vào dãy độ dài chọn Trong trường hợp chọn dãy độ dài theo công thức hi = (hi – - 1)/2 hk = 1, k = log2 - giải thuật có độ phức tạp tương đương n1,2 [...]... sắp xếp Page 20 Các thuật toán Sort HeapSort là O(nlogn) cho mọi trường hợp (Từ thực nghiệm cài đặt cho kết quả là ~ 4log2n) 1.8 MERGE SORT 1.8.1 Ý tưởng thuật toán  Cho dãy ban đầu a1, a2, …, an Ta luôn có thể coi nó là tập hợp liên tiếp của các dãy có thứ tự Ta gọi các dãy có thứ tự này là các dãy con  Trong phương pháp Merge Sort, vấn đề là ta tìm cách phân hoạch dãy ban đầu thành các dãy con Sau... 1.11 SHELL SORT 1.11.1 Ý tưởng thuật toán  Là giải thuật cải tiến từ Insertion sort Ý tưởng chính của thuật toán là phân chia dãy ban đầu thành nhưng dãy con mà mỗi phần tử của dãy cách nhau 1 vị trí là h Insertion sort áp dụng sau đó trên mỗi dãy con sẽ làm cho các phần tử được đưa về vị trí đúng tương đối (trong dãy con) 1 cách nhanh chóng  Sau đó tiếp tục giảm khoảng cách h để tạo thành các dãy con... sẽ được như sau : + Bước 1 : + Bước 2 : Page 24 Các thuật toán Sort + Bước 3 : + Bước 4 : + Bước 5 : + Bước 6 : Page 25 Các thuật toán Sort + Bước 7 : + Bước 8 : Sau khi hoàn tất cây thì chỉ cần duyệt theo phép LNR là ra một dãy số có thứ tự 1.9.3 Độ phức tạp  Độ phức tạp của thuật toán sort phụ thuộc vào 2 hàm chính là hàm chèn phần tử và duyệt hết các phần tử trong cây  Đối với hàm chèn phần tử... được độ phức tạp tính toán là O(n), vì nó phải duyệt qua tất cả các nút Page 26 Các thuật toán Sort 1.10 QUICK SORT 1.10.1 Ý tưởng thuật toán  QuickSort chia mảng thành hai danh sách bằng cách so sánh từng phần tử của danh sách với một phần tử được chọn được gọi là phần tử chốt Những phần tử nhỏ hơn hoặc bằng phần tử chốt được đưa về phía trước và nằm trong danh sách con thứ nhất, các phần tử lớn hơn... Page 21 Các thuật toán Sort 12 2 8 5 1 6 4 15 k = 1: k = 2: k = 4: 1.8.3 Độ phức tạp  Ta thấy ngay số lần lặp của bước 2(phân phối) và bước 3(trộn) bằng log 2n Ta cũng thấy rằng chi phí thực hiện bước 2 và bước 3 tỉ lệ thuận với n Như vậy, ta có thể ước tính chi phí thực hiện của giải thuật Merge Sort thuộc O(nlog2n) Page 22 Các thuật toán Sort  Ta nhận thấy rằng giải thuật làm việc một cách cứng... xếp  Thuật toán dừng khi h = 1, lúc này bảo đảm tất cả các phần tử trong dãy ban đầu sẽ được so sánh với nhau để xác định trật tự cuối cùng 1.11.2 Ví dụ minh họa Cho dãy số a: 12 2 8 5 1 Giả sử chọn các khoảng cách là 5, 3, 1 h = 5: xem dãy ban đầu như các dãy con h = 3: (sau khi đã sắp xếp các dãy con ở bước trước) h = 1: (sau khi đã sắp xếp các dãy con ở bước trước) Page 29 Các thuật toán Sort 6... đây còn là 1 bài toán mở vì trên lý thuyết vẫn tồn tại các dãy có thể đem lại tốc độ tối ưu hơn cho bài toán Page 30 Các thuật toán Sort Chương 2 THỰC NGHIỆM 2.1 PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH THỰC NGHIỆM 2.2 KẾT QUẢ THỰC NGHIỆM Chương 3 ĐÁNH GIÁ ĐỀ TÀI TÀI LIỆU THAM KHẢO Page 31 Các thuật toán Sort ... thấy dường như độ phức tạp thuật toán phụ thuộc mạnh vào chi phí chèn hơn là tìm kiếm, cho nên cách tốt hơn ta sẽ cài đặt bằng danh sách liên kết để việc chèn được tốt hơn  Độ phức tạp thuật toán như sau: o Trường hợp tốt nhất: O(nlogn) o Trường hợp xấu nhất O(n2) 1.7 HEAP SORT 1.7.1 Ý tưởng thuật toán  Định nghĩa Heap: Heap là mảng 1 chiều chứa các phần tử từ a 1, a2 … an Các phần tử từ a[n/2 + 1]... 4)(n - 1)/2 Tổng kết lại, ta có độ phức tạp của Insertion Sort như sau: o Trường hợp tốt nhất: O(n) o Trường hợp xấu nhất O(n2) 1.6 BINARY INSERTION SORT 1.6.1 Ý tưởng thuật toán  Đây là thuật toán cải tiến từ Insertion Sort, ta nhận thấy chi phí tìm kiếm vị trí thích hợp để chèn phần tử của Insertion là tuyến tính n, nên thuật toán này sẽ dùng cách tìm nhị phân để giảm số phép so sánh cho việc tìm kiếm... hoán vị a[j], a[j-1]  j=j-1 o Bước 3: i = i + 1  Nếu i

Ngày đăng: 26/05/2016, 15:39

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w