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

ĐỒ ÁN NHẬP MÔN PHÂN TÍCH ĐỘ PHỨC TẠP CỦA THUẬT TOÁN

31 3,8K 56

Đ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 575,5 KB

Nội dung

Toán Rời Rạc

Trang 1

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á các thuật toán Sort

Giảng viên hướng dẫn lý thuyết

Trang 2

MỞ ĐẦU

Đề tài nhóm chúng tôi là đánh giá độ phức tạp của các giải thuật sắp xếp Nói đếncác giải thuật sắp xếp thì có lẽ đây là một chủ đề đã quá quen thuộc và kinh điển.Tuy nhiên, vì chúng ta xem nó quá quen thuộc nên chúng ta thường hay quên nó

đi Mục tiêu của đề tài này là để chúng ta cùng nhau nắm lại tư tưởng của các thuậttoán sắp xếp, độ phức tạp về mặt lý thuyết, và hơn nữa, bằng thực nghiệm đánhgiá, kiểm chứng lại các độ phức tạp này

Nội dung của phần báo cáo được chia làm 2 phần lớn:

 Nền tảng lý thuyết: Giới thiệu tổng quan về tư tưởng, độ phức tạp của cácthuật toán sắp xếp

 Thực nghiệm: Nêu lên cách tiến hành thực nghiệm, kết quả và nhận xét

Page 2

Các thuật toán Sort

Trang 3

MỤC LỤC

Chương 1 NỀN TẢNG LÝ THUYẾT 5

1.1 SELECTION SORT 5

1.1.1 Ý tưởng thuật toán 5

1.1.2 Ví dụ minh họa 5

1.1.3 Độ phức tạp 5

1.2 INTERCHANGE SORT 6

1.2.1 Ý tưởng thuật toán 6

1.2.2 Ví dụ minh họa 6

1.2.3 Độ phức tạp 7

1.3 BUBBLE SORT 7

1.3.1 Ý tưởng thuật toán 7

1.3.2 Ví dụ minh họa 8

1.3.3 Độ phức tạp 8

1.4 SHAKER SORT 8

1.4.1 Ý tưởng thuật toán 8

1.4.2 Ví dụ minh họa 8

1.4.3 Độ phức tạp 8

1.5 INSERTION SORT 8

1.5.1 Ý tưởng thuật toán 8

1.5.2 Ví dụ minh họa 9

1.5.3 Độ phức tạp 9

1.6 BINARY INSERTION SORT 10

1.6.1 Ý tưởng thuật toán 10

1.6.2 Ví dụ minh họa 10

1.6.3 Độ phức tạp 10

1.7 HEAP SORT 10

1.7.1 Ý tưởng thuật toán 10

Trang 4

1.8 MERGE SORT 11

1.8.1 Ý tưởng thuật toán 11

1.8.2 Ví dụ minh họa 12

1.8.3 Độ phức tạp 12

1.9 BINARY TREE 12

1.9.1 Ý tưởng thuật toán 12

1.9.2 Ví dụ minh họa 13

1.9.3 Độ phức tạp 13

1.10 QUICK SORT 13

1.10.1 Ý tưởng thuật toán 13

1.10.2 Ví dụ minh họa 14

1.10.3 Độ phức tạp 14

1.11 SHELL SORT 14

1.11.1 Ý tưởng thuật toán 14

1.11.2 Ví dụ minh họa 15

1.11.3 Độ phức tạp 15

Chương 2 THỰC NGHIỆM 15

2.1 PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH THỰC NGHIỆM 15

2.2 KẾT QUẢ THỰC NGHIỆM 16

Chương 3 ĐÁNH GIÁ ĐỀ TÀI 16

TÀI LIỆU THAM KHẢO 16

Chương 1 NỀN TẢNG LÝ THUYẾT

Page 4

Các thuật toán Sort

Trang 5

1.1 SELECTION SORT

1.1.1 Ý tưởng thuật toán

 Ta chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về đầu dãyhiện hành Sau đó, ta không quan tâm đến nó nữa, ta xem dãy hiện hành chỉcòn N-1 phần tử của dãy ban đầu tính từ vị trí thứ 2 Cứ vậy, cho đến khi dãyhiện hành chỉ còn 1 phần tử, ta được 1 dãy sắp tăng

 Các bước tiến hành như sau:

 Nếu i < =N-1: quay trở lại bước 2

 Ngược lại: STOP!

1.1.2 Ví dụ minh họa

Cho dãy số 1 2 8 5 12 6 4 15

Hình minh họa cho quá trình sắp xếp của dãy số trên:

Trang 6

1.1.3 Độ phức tạp

Để chọn được 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)

và sau đó hoán vị nó với phần tử đầu tiên của dãy hiện hành Để tìm phần tử nhỏ

nhất tiếp theo, ta cần duyệt qua n-1 phần tử (tốn n-2 phép so sánh) Cứ như vậy, ta

thấy ngay thuật toán sẽ tốn (n-1) + (n-2) + … + 1 = n(n-1)/2 = O(n2) phép so sánh

Page 6

Các thuật toán Sort

D Dãy được sắp xếp tăng

Trang 7

Mỗi lần duyệt, ta luôn phải hoán vị 1 lần (1 hoán vị tương đương với 3 phép gán),nghĩa là thuật toán sẽ tốn 3(n-1) + 3(n-2) + … + 3 = 3n(n-1)/2 = O(n2) phép gán.

Tổng kết lại, ta luôn có độ phức tạp của thuật toán Selection Sort thuộc O(n 2 ) trong mọi trường hợp.

1.2 INTERCHANGE SORT

1.2.1 Ý tưởng thuật toán

 Ý tưởng chính của thuật toán này là ta tìm các cặp nghịch thế và triệt tiêuchúng Ta xuất phát từ phần tử đầu tiên của dãy, tìm tất các các cặp nghịch thếchứa phần tử này, triệt tiêu chúng bằng các hoán vị phần tử này với phần tửtương ứng trong cặp nghịch thế Ta dễ nhận thấy sau lần duyệt đầu tiên, phần

tử đầu tiên chính là phần tử nhỏ nhất của dãy Ta tiếp tục xử lý với phần tử thứhai, ta có được phần tử thứ hai chính là phần tử nhỏ thứ hai của dãy Cứ nhưvậy, sau khi xử lý với phần tử thứ N -1 của dãy, ta được một dãy sắp tăng

 Các bước tiến hành như sau:

o Bước 1: Khởi động i = 1

o Bước 2: j = i+1

o Bước 3: Trong khi j <= N thực hiện:

 Nếu a[i]>a[j]: Hoán vị a[i] và a[j]

 j = j+1

o Bước 4: i = i+1

 Nếu i <= N-1: quay trở lại bước 2

 Ngược lại: STOP!

Trang 8

1.2.2 Ví dụ minh họa

Cho dãy số : 12 2 8 5 1 6 4 15 Hình minh họa cho quá trình sắp xếp của dãy số trên:

Page 8

Các thuật toán Sort

Trang 10

10

Các thuật toán Sort

Trang 11

1.2.3 Độ phức tạp

 Thấy ngay số phép so sánh là luôn không đổi, tức không phụ thuộc vào tình

trạng ban đầu của dãy Ta có thể ước lượng số phép so sánh bằng (n-1) + (n-2)

+ … + 1 = n(n-1)/2 (phần tử thứ i được so sánh với n-i phần tử còn lại.)

 Số phép hoán vị (tương đương 3 phép gán) lại phụ thuộc vào tình trạng ban đầu

của dãy Cụ thể như sau:

o Trường hợp tốt nhất: Dãy ban đầu đã có thứ tự Ta thấy ngay ta không

tốn một phép hoán vị nào

o Trường hợp xấu nhất: Dãy ban đầu có thứ tự ngược Ta thấy ngay mỗi

lần so sánh phần tử thứ i với n-i phần tử còn lại, ta đều phải thực hiệnhoán vị Điều này có nghĩa là số phép hoán vị bằng n(n-1)/2

Tổng kết lại, ta có độ phức tạp của Interchange Sort thuộc O(n 2 ) trong mọi trường

hợp.

D Dãy được sắp xếp tăng

Trang 12

1.3 BUBBLE SORT

1.3.1 Ý tưởng thuật toán

 Xét từ đáy và phần tử nhẹ nổi lên trên

 Các bước thực hiện:

o Bước 1: Khởi động i = 1

o Bước 2: j = N //Duyệt từ cuối dãy về vị trí i

Trong khi j>i thực hiện:

 Nếu a[j]<a[j-1]: hoán vị a[j], a[j-1]

 j = j - 1

o Bước 3: i = i + 1

 Nếu i <= N-1: quay trở lại bước 2

 Ngược lại: STOP!

Trang 13

1.3.3 Độ phức tạp

 Thấy ngay số phép so sánh là luôn không đổi, tức không phụ thuộc vào tình

trạng ban đầu của dãy Với i bất kỳ, ta luôn phải so sánh V[j] với V[j-1], mà j

chạy từ n đến i+1, tức ta tốn n-i phép so sánh Thêm nữa, i chạy từ 1 đến n-1

Vậy ta tính được số phép so sánh tổng cộng: ∑(n-i) với i chạy từ 1 đến n-1 =

(n-1) + (n-2) + … + 1 = n(n-1)/2

 Số phép hoán vị (tương đương 3 phép gán) lại phụ thuộc vào tình trạng ban đầu

D Dãy được sắp xếp tăng

Trang 14

o Trường hợp tốt nhất: Dãy ban đầu đã có thứ tự Ta thấy ngay ta khôngtốn một phép hoán vị nào.

o Trường hợp xấu nhất: Dãy ban đầu có thứ tự ngược Xét i bất kỳ, ta thấyrằng mỗi lần so sánh a[j] với a[j-1], ta đều phải thực hiện hoán vị Điềunày có nghĩa là số phép hoán vị bằng n(n-1)/2

Tổng kết lại, ta có độ phức tạp của Bubble Sort thuộc O(n 2 ) trong mọi trường hợp.

1.4 SHAKER SORT

1.4.1 Ý tưởng thuật toán

 Đây là thuật toán cải tiến từ thuật toán Bubble Sort

 Ta thấy ở mỗi lượt duyệt phần tử nhẹ nổi lên rất nhanh, còn phần tử nặng chìmxuống rất chậm, nên ta sẽ cải tiến thêm 1 chiều duyệt ngược lại để phần từ nặngchìm nhanh hơn

 Từ vị trí đổi chỗ cuối cùng đến đầu dãy đã được sắp xếp, cho nên cần thêm 1biến lưu vị trí đổi chỗ cuối cùng để tăng tốc độ

1.4.2 Ví dụ minh họa

1.4.3 Độ phức tạp

 Ta thấy sự chuyển dời của phần tử không có gì là cải tiến (từ vị trí ban đầu của

nó, để đi đến vị trí đúng đều mất chi phí như Bubble Sort)

 Chỉ có số phép so sánh là được cải tiến, nhưng chưa tìm được công thức tính sốphép so sánh, mặt khác ta thấy chi phí chuyển dời luôn cao hơn (Chi phí hoán

vị thường mất 3 phép gán) so sánh nên cải tiến có thể xem như không đáng kể.Thuật toán vẫn được xếp ở O(n2)

1.5 INSERTION SORT

1.5.1 Ý tưởng thuật toán

 Giả sử ta có dãy a1, a2, …, an trong đó i phần tử đầu tiên a1, a2, …, ai đã có thứ

tự Ý tưởng của thuật toán là tìm vị trị thích hợp và chèn phần tử ai+1 vào dãy đã

có thứ tự trên để có được một dãy mới có thứ tự Cứ thế, làm đến cuối dãy ta sẽđược một dãy có thứ tự

Page

14

Các thuật toán Sort

Trang 15

 Với dãy ban đầu a1, a2, …, an ta có thể coi đoạn chỉ có một phần tử a1 là một đoạn đã có thứ tự, sau đó ta chèn phần tử a2 vào dãy a1 để có dãy a1a2 có thứ tự Tiếp đó, ta lại chèn phần tử a3 vào dãy a1a2 để có dãy a1a2a3 có thứ tự Cứ thế, đến cuối cùng ta chèn phần tử an vào dãy a1a2…an-1 ta sẽ được dãy a1a2…an có thứ tự.

 Các bước thực hiện:

o Bước 1: Khởi động với i = 2 //Đoạn a[1] đã được sắp

o Bước 2: x = a[i] Tìm vị trí thích hợp pos trong đoạn a[1]…a[i-1] để chèn x vào

o Bước 3: Dời đoạn a[pos]…a[i-1] sang phải để có chỗ đưa x vào

o Bước 4: a[pos] = x

o Bước 5: i = i + 1

 Nếu i<=n: quay lại bước 2

 Ngược lại: STOP!

1.5.2 Ví dụ minh họa

Cho dãy số a:

12 2 8 5 1 6 4 15

Trang 16

1.5.3 Độ phức tạp

 Ta thấy các phép so sánh xảy ra trong vòng lặp nhằm tìm vị trí thích hợp pos đểchèn x Mỗi lần so sánh mà thấy vị trí đang xét không thích hợp, ta dời phần tửa[pos] sang phải

 Ta cũng thấy số phép gán và số phép so sánh của thuật toán phụ thuộc vào tìnhtrạng của dãy ban đầu Do đó ta chỉ có thể ước lượng như sau:

o Trường hợp tốt nhất: dãy ban đầu đã có thứ tự Ta tìm được ngay vị tríthích hợp để chèn ngay lần so sánh đầu tiên mà không cần phải vô vònglặp Như vậy, với i chạy từ 2 đến n thì số phép so sánh tổng cộng sẽ là n-

1 Còn với số phép gán, do thuật toán không chạy vào vòng lặp nên xét i

Page

16

Các thuật toán Sort

Trang 17

bất kỳ, ta luôn chỉ phải tốn 2 phép gán(x = a[i] và a[pos] = x) Từ đây, tatính được số phép gán tổng cộng bằng 2(n - 1).

o Trường hợp xấu nhất: dãy ban đầu có thứ tự ngược Ta thấy ngay vị tríthích hợp pos luôn là vị trí đầu tiên của dãy đã có thứ tự, và do đó, đểtìm ra vị trí này ta phải duyệt hết dãy đã có thứ tự Xét i bất kỳ, ta có sốphép so sánh là i-1, số phép gán là (i - 1) + 2 = i + 1 Với i chạy từ 2 đến

n, ta tính được số phép so sánh tổng cộng bằng 1 + 2 + … + (n - 1) = n(n

- 1)/2 và số phép gán bằng 3 + 4 + + (n + 1) = (n + 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(n 2 )

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 còn log2n

1.6.2 Ví dụ minh họa

1.6.3 Độ phức tạp

 Ta nhận thấy rằng cải tiến của thuật toán chỉ giúp việc tìm kiếm nhanh hơn,giảm đi chi phí so sánh trong lúc tìm kiếm, còn chi phí cho việc chèn vẫnkhông thay đổi (vẫn phải dịch đúng k phần tử như Insertion Sort để chèn) nênchi phí phép gán không có cải tiến

 Tìm kiếm tốt nhất khi vừa tìm phần tử lần đầu là ra ngay, phần tử đó sẽ nằm ở

vị trí middle của dãy đã có thứ tự, nhưng chi phí chèn lúc này sẽ là n/2, với chiphí này còn cao so với trường hợp tốt nhất

 Thuật toán chỉ tốt nhất khi chi phí chèn là 1, ứng với phần tử tìm phải nằm ởcuối dãy có thứ tự, chi phí tìm lúc này là log2n, mà ta phải làm n lần cho n phần

Trang 18

 Thuật toán xấu nhất khi phần tử tìm được nằm ở đầu dãy, chi phí chèn lúc này

là n (tìm kiếm là log2n, nhưng chi phí chèn mạnh hơn), mà có n phần tử nên làO(n2)

 Ta thấy dường như độ phức tạp thuật toán phụ thuộc mạnh vào chi phí chènhơ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(n 2 )

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ừ a1, a2 … an Cácphần tử từ a[n/2 + 1] đến a[n] là heap tự nhiên Các phần tử còn lại thỏa a[i] >= a[2*i]

và a[i] >= a[2*i+1] (i=1…n/2) (Điều kiện này là cho sắp xếp tăng dần)

 Như vậy ta thấy gốc của heap luôn là phần tử lớn nhất, nếu ta lần lượt rút tríchphần tử gốc và xây dựng lại heap đã bị rút trích ta sẽ có một 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 và cuối mảng, rồi giảm dần số phần tử củamả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 và hoán vị như trên cho đến hết ta sẽ có dãyđược sắp thứ tự tăng dần (muốn sắp giảm dần ta chi cần cho phần tử gốccủa heap là phần tử nhỏ nhất)

1.7.2 Ví dụ minh họa

Cho dãy số a:

12 2 8 5 1 6 4 15Giai đoạn 1: hiệu chỉnh dãy ban đầu thành heap

Page

18

Các thuật toán Sort

Trang 19

Giai đoạn 2: Sắp xếp dãy số dựa trên heap:

Trang 20

Thực hiện tương tự cho r = 5, 4, 3, 2 ta được:

1.7.3 Độ phức tạp

 Ta thấy được chi phí cho xây dựng heap khi thêm vào heap một phần tử mới làlog2n (chính là chiều cao heap cho mỗi lần làm chìm phần tử xuống vị trí thíchhợp), mặt khác từ bước 2 đến bước 3 ứng với mỗi phần tử ta sẽ xây dựng lạiheap một lần, mà ta có n phần tử Vậy ta có thể ước tính chi phí cho sắp xếp

Page

20

Các thuật toán Sort

Trang 21

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ácdã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 đầuthành các dãy con Sau khi phân hoạch xong, dãy ban đầu sẽ được tách thànhhai dãy phụ theo nguyên tắc phân phối luân phiên dãy con Sau đó, ta trộn từngcặp dãy con của hai dãy phụ thành một dãy con của dãy ban đầu Ta nhận thấy

số dãy con của dãy ban đầu lúc này giảm đi ít nhất là một nửa Cứ thế sau một

số bước, ta sẽ nhận được dãy ban đầu với số dãy con bằng 1, có nghĩa là ta đãsắp xếp xong

Trộn trực tiếp: đây là phương pháp trộn đơn giản nhất Việc phân hoạch dãy

ban đầu đơn giản như sau: Với dãy ban đầu có n phân tử, ta cứ phân hoạchthành n dãy con Vì rằng mỗi dãy con chỉ có 1 phần tử nên nó là dãy có thứ tự

Cứ mỗi lần tách – trộn, chiều dài của dãy con sẽ được nhân đôi

 Các bước tiến hành:

o Bước 1: Khởi động k = 1 //Với k là chiều dài dãy con

o Bước 2: Phân phối dãy a = a1, a2, …, an vào hai dãy phụ b, c theo nguyêntắc phân phối luân phiên từng dãy con

b = a1, …, ak, a2k+1, …, a3k, …

c = ak+1, …, a2k, a3k+1, …, a4k

o Bước 3: Từ 2 dãy phụ b, c, ta trộn từng cặp dãy con và đưa vào dãy a

o Bước 4: k = k*2

 Nếu k<n: quay lại bước 2

 Ngược lại: STOP!

1.8.2 Ví dụ minh họa

Trang 23

 Ta nhận thấy rằng giải thuật làm việc một cách cứng nhắc, không tận dụngđược tính thứ tự một phần của dãy ban đầu Do đó, trong mọi trường hợp độphức tạp là như nhau Đây là một nhược điểm của phương pháp trộn trực tiếp.

1.9 BINARY TREE

1.9.1 Ý tưởng thuật toán

 Việc sắp xếp trên cây nhị phân tìm kiếm được gói gọn xử lí trong 2 công việc

là chèn các khóa mới vào trong cây và duyệt cây nhị phân theo thứ tự LNR

 Chèn một khóa mới vào trong cây nhị phân tìm kiếm: phép chèn bắt đầu giốngnhư phép tìm kiếm Nếu khóa của nút gốc khác khóa cần chèn ta tìm nó trongcây con trái hoặc phải Nếu cây con trái hoặc phải tương ứng là rỗng (khôngtìm thấy) thì thêm một nút và gán cho nút ấy khóa cần chèn

void InsertNode(struct node *&treeNode,struct node *newNode)

Trang 24

1.9.2 Ví dụ minh họa

Duyệt cây theo thứ tự LNR : Cho một cây như sau :

Thứ tự của phép duyệt LNR : CBEDFAKHL

Ví dụ cụ thể :

Cho dãy sau : 44 55 12 42 94 18 6 67

Khi insert vào cây ta sẽ được như sau :

Trang 25

+ Bước 3 :

+ Bước 4 :

+ Bước 5 :

+ Bước 6 :

Trang 26

+ 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ử : ta có thể thấy rằng thời gian chạy tỉ lệ thuận vớichiều cao của cây -> trường hợp xấu nhất đối với mảng đã sắp, tiêu tốn Ω (n),

và O(log n) trong trường hợp trung bình

 Đối với hàm duyệt phần tử: luôn luô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

Ngày đăng: 28/03/2014, 21:37

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w