Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 13: Các thuật toán sắp xếp
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 13: Các thuật toán sắp xếp", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_bai_13_cac_thuat_to.pdf
Nội dung text: Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 13: Các thuật toán sắp xếp
- Tài liệu tham khảo: Bài giảng SMA 5503 Introduction to Algorithms. 2001-5 Erik D. Demaine and Charles E. Leiserson. Bài 13: Các thuật toán sắp xếp Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – Đại học Công Nghệ Cấu trúc dữ liệu và giải thuật HKI, 2013-2014
- Nội dung chính 1. Bài toán sắp xếp 2. Sắp xếp xen vào 3. Sắp xếp trộn 4. Sắp xếp nhanh 5. Sắp xếp sử dụng cây thứ tự bộ phận 6. Sắp xếp đếm 7. Sắp xếp cơ số 2 diepht@vnu
- Bài toán sắp xếp Lí do: Một trong những bài toán được nghiên cứu lâu đời nhất trong CNTT Chứa nhiều kĩ thuật về thuật toán Input: dãy số Output: 1 hoán vị của input thỏa mãn a1’<= a2’<= <= an’ Ý nghĩa? Bài toán tìm kiếm Bài toán phát hiện phần tử lặp 3 diepht@vnu
- Ví dụ bài toán tìm kiếm x = 5 A = (3, 1, 4, 15, 9, 26, 53, 58, 97, 93, 23, 8, 46, 26, 4, 33, 8, 3, 2) B = (1, 2, 3, 3, 4, 4, 8, 8, 9, 15, 23, 26, 26, 33, 46, 53, 58, 93, 97) x có trong A? x có trong B? 4 INT2203/w13 diepht@vnu
- Ví dụ bài toán phát hiện phần tử lặp A = (3, 1, 4, 15, 9, 26, 53, 58, 97, 93, 23, 8, 46, 26, 4, 33, 8, 3, 2) B = (1, 2, 3, 3, 4, 4, 8, 8, 9, 15, 23, 26, 26, 33, 46, 53, 58, 93, 97) Các giá trị xuất hiện hơn 1 lần trong A? Các giá trị xuất hiện hơn 1 lần trong B? 5 INT2203/w13 diepht@vnu
- Tổng quan TTSX lựa chọn O(n2) TTSX nổi bọt TTSX xen vào TTSX trộn Sắp xếp trong Sắp xếp O(n logn) TTSX nhanh Sắp xếp ngoài TTSX sử dụng heap O(n) TTSX theo cơ số 6 INT2203/w13 diepht@vnu
- Tổng quan Selection sort O(n2) Bubble sort Insertion sort Merge sort In-memory sort Sorting O(n logn) Quicksort External sort Heapsort O(n) Radix sort 7 INT2203/w13 diepht@vnu
- Với mỗi thuật toán sắp xếp Lịch sử ra đời Cài đặt bằng ngôn ngữ Ý tưởng C++ Giả mã có trong STL không? Tính ổn định (stability) Ví dụ Liên hệ với các thuật Phân tích độ phức tạp toán sắp xếp khác thời gian Vận dụng thế nào? 8 INT2203/w13 diepht@vnu
- Insertion Sort 9 diepht@vnu
- Thuật toán sắp xếp xen vào INSERTION-SORT (A, n) ⊳ A[1 . . n] for j ← 2 to n do key ← A[ j] i ← j – 1 “pseudocode” while i > 0 and A[i] > key do A[i+1] ← A[i] i ← i – 1 A[i+1] = key 10 diepht@vnu
- Thuật toán sắp xếp xen vào INSERTION-SORT (A, n) ⊳ A[1 . . n] for j ← 2 to n do key ← A[ j] i ← j – 1 “pseudocode” while i > 0 and A[i] > key do A[i+1] ← A[i] i ← i – 1 A[i+1] = key 1 i j n A: key sorted 11 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 12 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 13 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 14 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 15 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 16 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 17 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 18 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 19 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 20 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 21 diepht@vnu
- Minh họa SX xen vào 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 2 3 4 6 8 9 done 22 diepht@vnu
- Phân tích độ phức tạp Thời gian chạy phụ thuộc bản thân input Nếu đã sắp đúng thứ tự? ngược thứ tự? Kích thước dữ liệu vào Thời gian chạy xấu nhất? 23 diepht@vnu
- Merge Sort 24 diepht@vnu
- Thuật toán sắp xếp trộn MERGE-SORT A[1 . . n] 1. If n = 1, done. 2. Recursively sort A[ 1 . . ⎡n/2⎤ ] and A[ ⎡n/2⎤+1 . . n ] . 3. “Merge” the 2 sorted lists. Key subroutine: MERGE John von Neumann 25 diepht@vnu
- Trộn 2 mảng tăng 20 12 13 11 7 9 2 1 26 diepht@vnu
- Trộn 2 mảng tăng 20 12 13 11 7 9 2 1 1 27 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 13 11 13 11 7 9 7 9 2 1 2 1 28 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 13 11 13 11 7 9 7 9 2 1 2 1 2 29 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 13 11 13 11 13 11 7 9 7 9 7 9 2 1 2 1 2 30 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 13 11 13 11 13 11 7 9 7 9 7 9 2 1 2 1 2 7 31 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 32 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 33 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 34 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 35 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 36 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 12 37 diepht@vnu
- Trộn 2 mảng tăng 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 12 Thời gian trộn là tuyến tính 38 diepht@vnu
- Phân tích độ phức tạp T(n) MERGE-SORT A[1 . . n] Θ(1) 1. If n = 1, done. 2T(n/2) 2. Recursively sort A[ 1 . . ⎡n/2⎤ ] and A[ ⎡n/2⎤+1 . . n ] . Θ(n) 3. “Merge” the 2 sorted lists 39 diepht@vnu
- Cây đệ quy Giải T(n) = 2T(n/2) + cn, với hằng c > 0 cn cn cn/2 cn/2 cn h = lg n cn/4 cn/4 cn/4 cn/4 cn Θ(1) số lá = n Θ(n) Tổng = Θ(n lg n) 40 diepht@vnu
- Quicksort 41 diepht@vnu
- Thuật toán sắp xếp nhanh Chia để trị “in place” Hiệu quả trên dữ liệu thực tuning Ý tưởng Tony Hoare 42 diepht@vnu
- Mô tả Sắp xếp nhanh mảng n phần tử 1. Chia: Phân hoạch (chia) mảng cần sắp thành 2 mảng con ở 2 phía của chốt x ; sao cho các phần tử ở mảng con bên trái = x 2. Trị: Sắp xếp đệ quy các mảng con 3. Kết hợp: không làm gì. Điểm then chốt: thủ tục phân hoạch chạy trong thời gian tuyến tính. 43 diepht@vnu
- Giả mã thủ tục phân hoạch PARTITION(A, p, q) ⊳ A[ p . . q] x ← A[ p] ⊳ pivot = A[ p] Thời gian chạy i ← p là O(n) for j ← p + 1 to q do if A[ j] ≤ x then i ← i + 1 exchange A[i] ↔ A[ j] exchange A[ p] ↔ A[i] return i Duy trì: 44 diepht@vnu
- Minh họa thuật toán phân hoạch 6 10 13 5 8 3 2 11 i j 45 diepht@vnu
- Minh họa thuật toán phân hoạch 6 10 13 5 8 3 2 11 i > j 46 diepht@vnu
- Minh họa thuật toán phân hoạch 6 10 13 5 8 3 2 11 i > j 47 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 13 10 8 3 2 11 > i j 48 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 13 10 8 3 2 11 i > j 49 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 13 10 8 3 2 11 i > j 50 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 3 10 8 13 2 11 > i j 51 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 3 10 8 13 2 11 i > j 52 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 3 2 8 13 10 11 > i j 53 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 3 2 8 13 10 11 i > j 54 diepht@vnu
- Minh họa thuật toán phân hoạch 6 5 3 2 8 13 10 11 i > j 55 diepht@vnu
- Minh họa thuật toán phân hoạch 2 5 3 6 8 13 10 11 i 56 diepht@vnu
- Giả mã thuật toán sắp xếp nhanh QUICKSORT(A, p, r) if p < r then q ← PARTITION(A, p, r) QUICKSORT(A, p, q–1) QUICKSORT(A, q+1, r) Lời gọi ban đầu: QUICKSORT(A, 1, n) 57 diepht@vnu
- Cây đệ quy trường hợp xấu nhất T(n) = T(0) + T(n–1) + cn cn Θ(1) c(n–1) Θ(1) c(n–2) 2 h = n T(n) = Θ(n) + Θ(n ) (1) = Θ(n2) Θ O Θ(1) 58 diepht@vnu
- Trường hợp tốt nhất? PARTITION chia mảng thành 2 nửa bằng nhau T(n) = 2T(n/2) + Θ(n) = Θ(n lg n) 59 diepht@vnu
- Heapsort 60 diepht@vnu
- Sắp xếp sử dụng cây thứ tự bộ phận Ý tưởng Nếu cần sắp tăng dần, dùng max heap Nếu cần sắp giảm dần, dùng min heap 1: Bố trí lại dữ liệu trong mảng để nó thỏa mãn tính chất của heap. 2: Lặp lại: Đảo chỗ gốc và đỉnh cuối của heap Giảm cỡ của heap đi 1 rồi khôi phục tính chất của heap 61 INT2203/w13 diepht@vnu
- Giả mã Algorithm heapSort(A, n) buildHeap(A, n) // tao 1 max-heap tu A for end <- n-1 to 1 do swap(A[0], A[end]) downheap(A, end) 62 INT2203/w13 diepht@vnu
- Thuật toán sắp xếp có thể nhanh tới cỡ nào? 63 diepht@vnu
- Cận dưới của sắp xếp Các thuật toán sắp xếp dựa trên so sánh các cặp phần tử comparison sorting, comparison model có thời gian xấu nhất không thể tốt hơn O(nlogn) Chứng minh bằng mô hình cây quyết định. Tham khảo: Lecture 5 64 diepht@vnu
- Sắp xếp trong thời gian tuyến tính Thuật toán sắp xếp đếm counting sort không so sánh các cặp phần tử Giả sử dãy số nguyên nằm trong một khoảng nào đó 65 diepht@vnu
- Counting sort Input: A[1 . . n], trong đó A[ j] {1, 2, , k} . Output: B[1 . . n] được sắp. ∈ Mảng nhớ phụ trợ: C[1 . . k] . 66 diepht@vnu
- Counting sort: giả mã for i 1 to k do C[i] 0 for j ← 1 to n do C[A[← j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}| for i ← 2 to k do C[i] C←[i] + C[i–1] ⊳ C[i] = |{key i}| for j ← n downto 1 do B[C[←A[ j]]] A[ j] ≤ ←C[A[ j]] C[A[ j]] – 1 ← 67 diepht@vnu ←
- Minh họa counting sort 1 2 3 4 5 1 2 3 4 A: 44 11 33 44 33 C: B: 68 diepht@vnu
- Vòng for thứ nhất 1 2 3 4 5 1 2 3 4 A: 44 11 33 44 33 C: 00 00 00 00 B: for i 1 to k do← C[i] 0 69 diepht@vnu ←
- Vòng for thứ 2 70 diepht@vnu
- Vòng for thứ 2 71 diepht@vnu
- Vòng for thứ 2 72 diepht@vnu
- Vòng for thứ 2 73 diepht@vnu
- Vòng for thứ 2 74 diepht@vnu
- Vòng for thứ 3 75 diepht@vnu
- Vòng for thứ 3 76 diepht@vnu
- Vòng for thứ 3 77 diepht@vnu
- Vòng for thứ 4 78 diepht@vnu
- Vòng for thứ 4 79 diepht@vnu
- Vòng for thứ 4 80 diepht@vnu
- Vòng for thứ 4 81 diepht@vnu
- Vòng for thứ 4 82 diepht@vnu
- Phân tích độ phức tạp for i 1 to k (k) do C[i] 0 for j ← 1 to n Θ(n) do C[A[← j]] C[A[ j]] + 1 ← for i 2 to k Θ(k) ← do C[i] C[i] + C[i–1] ← Θ for j n downto 1 (n) do B[C[←A[ j]]] A[ j] ←C[A[ j]] C[A[ j]] – 1 Θ ← (n + k) ← 83 diepht@vnu Θ
- Tính ổn định của thuật toán sắp xếp Thuật toán sắp xếp đếm có tính ổn định: nó bảo toàn được thứ tự giữa các phần tử có giá trị bằng nhau. 84 diepht@vnu
- Thuật toán sắp xếp cơ số (radix sort) Sắp xếp theo từng “chữ số” bằng 1 thuật toán sắp xếp ổn định. VD: counting sort Xuất phát từ chữ số ít quan trọng hơn 85 diepht@vnu
- Minh họa radix sort 86 diepht@vnu
- Chuẩn bị tuần tới Lý thuyết: Bài tập SV rà soát các chương học sau thi giữa kì Thực hành: Các chiến lược thiết kế thuật toán 87 diepht@vnu