BÀI GIẢNG GIẢI THUẬT VÀ LẬP TRÌNH - QUY HOẠCH ĐỘNG - LÊ MINH HOÀNG - 4
Số trang: 36
Loại file: pdf
Dung lượng: 2.21 MB
Lượt xem: 12
Lượt tải: 0
Xem trước 4 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Có thể nhận xét thêm là QuickSort đệ quy cần thêm không gian nhớ cho Stack, còn HeapSort ngoài một nút nhớ phụ để thực hiện việc đổi chỗ, nó không cần dùng thêm gì khác. HeapSort tốt hơn QuickSort về phương diện lý thuyết bởi không có trường hợp tồi tệ nào HeapSort có thể mắc phải. Cũng nhờ có HeapSort mà giờ đây khi giải mọi bài toán có chứa mô-đun sắp xếp, ta có thể nói rằng độ phức tạp của thủ tục sắp xếp đó không quá O(nlog2n)....
Nội dung trích xuất từ tài liệu:
BÀI GIẢNG GIẢI THUẬT VÀ LẬP TRÌNH - QUY HOẠCH ĐỘNG - LÊ MINH HOÀNG - 4 Cấu trúc dữ liệu và Giải thuật 95 thời gian thực hiện trung bình phức tạp hơn, ta chỉ ghi nhận một kết quả đã chứng minh được là độ phức tạp trung bình của HeapSort cũng là O(nlog2n). Có thể nhận xét thêm là QuickSort đệ quy cần thêm không gian nhớ cho Stack, còn HeapSort ngoài một nút nhớ phụ để thực hiện việc đổi chỗ, nó không cần dùng thêm gì khác. HeapSort tốt hơn QuickSort về phương diện lý thuyết bởi không có trường hợp tồi tệ nào HeapSort có thể mắc phải. Cũng nhờ có HeapSort mà giờ đây khi giải mọi bài toán có chứa mô-đun sắp xếp, ta có thể nói rằng độ phức tạp của thủ tục sắp xếp đó không quá O(nlog2n). 8.8. SẮP XẾP BẰNG PHÉP ĐẾM PHÂN PHỐI (DISTRIBUTION COUNTING) Có một thuật toán sắp xếp đơn giản cho trường hợp đặc biệt: Dãy khoá k1, k2, …, kn là các số nguyên nằm trong khoảng từ 0 tới M (TKey = 0..M). Ta dựng dãy c0, c1, …, cM các biến đếm, ở đây cV là số lần xuất hiện giá trị V trong dãy khoá: for V := 0 to M do cV := 0; {Khởi tạo dãy biến đếm} for i := 1 to n do cki := cki + 1; Ví dụ với dãy khoá: 1, 2, 2, 3, 0, 0, 1, 1, 3, 3 (n = 10, M = 3), sau bước đếm ta có: c0 = 2; c1 = 3; c2 = 2; c3 = 3. Dựa vào dãy biến đếm, ta hoàn toàn có thể biết được: sau khi sắp xếp thì giá trị V phải nằm từ vị trí nào tới vị trí nào. Như ví dụ trên thì giá trị 0 phải nằm từ vị trí 1 tới vị trí 2; giá trị 1 phải đứng liên tiếp từ vị trí 3 tới vị trí 5; giá trị 2 đứng ở vị trí 6 và 7 còn giá trị 3 nằm ở ba vị trí cuối 8, 9, 10: 0011122333 Tức là sau khi sắp xếp: Giá trị 0 đứng trong đoạn từ vị trí 1 tới vị trí c0. Giá trị 1 đứng trong đoạn từ vị trí c0 + 1 tới vị trí c0 + c1. Giá trị 2 đứng trong đoạn từ vị trí c0 + c1 + 1 tới vị trí c0 + c1 + c2. … Giá trị v trong đoạn đứng từ vị trí c0 + c1 + … + cv-1 + 1 tới vị trí c0 + c1 + c2 + … + cv. … Để ý vị trí cuối của mỗi đoạn, nếu ta tính lại dãy c như sau: for V := 1 to M do cV := cV-1 + cV Thì cV là vị trí cuối của đoạn chứa giá trị V trong dãy khoá đã sắp xếp. Muốn dựng lại dãy khoá sắp xếp, ta thêm một dãy khoá phụ x1, x2, …, xn. Sau đó duyệt lại dãy khoá k, mỗi khi gặp khoá mang giá trị V ta đưa giá trị đó vào khoá xcv và giảm cv đi 1. for i := n downto 1 do begin V := ki; XcV := ki; cV := cV - 1; end; Lê Minh Hoàng 96 Chuyên đề Khi đó dãy khoá x chính là dãy khoá đã được sắp xếp, công việc cuối cùng là gán giá trị dãy khoá x cho dãy khoá k. procedure DistributionCounting; {TKey = 0..M} var c: array[0..M] of Integer; {Dãy biến đếm số lần xuất hiện mỗi giá trị} x: TArray; {Dãy khoá phụ} i: Integer; V: TKey; begin for V := 0 to M do cV := 0; {Khởi tạo dãy biến đếm} for i := 1 to n do cki := cki + 1; {Đếm số lần xuất hiện các giá trị} for V := 1 to M do cV := cV-1 + cV; {Tính vị trí cuối mỗi đoạn} for i := n downto 1 do begin V := ki; xcV := ki; cV := cV - 1; end; k := x; {Sao chép giá trị từ dãy khoá x sang dãy khoá k} end; Rõ ràng độ phức tạp của phép đếm phân phối là O(max(M, n)). Nhược điểm của phép đếm phân phối là khi M quá lớn thì cho dù n nhỏ cũng không thể làm được. Có thể có thắc mắc tại sao trong thao tác dựng dãy khoá x, phép duyệt dãy khoá k theo thứ tự nào thì kết quả sắp xếp cũng như vậy, vậy tại sao ta lại chọn phép duyệt ngược từ dưới lên?. Để trả lời câu hỏi này, ta phải phân tích thêm một đặc trưng của các thuật toán sắp xếp: 8.9. TÍNH ỔN ĐỊNH CỦA THUẬT TOÁN SẮP XẾP (STABILITY) Một phương pháp sắp xếp được gọi là ổn định nếu nó bảo toàn thứ tự ban đầu của các bản ghi mang khoá bằng nhau trong danh sách. Ví dụ như ban đầu danh sách sinh viên được xếp theo thứ tự tên alphabet, thì khi sắp xếp danh sách sinh viên theo thứ tự giảm dần của điểm thi, những sinh viên bằng điểm nhau sẽ được dồn về một đoạn trong danh sách và vẫn được giữ nguyên thứ tự tên alphabet. Hãy xem lại nhưng thuật toán sắp xếp ở trước, trong những thuật toán đó, thuật toán sắp xếp nổi bọt, thuật toán sắp xếp chèn và phép đếm phân phối là những thuật toán sắp xếp ổn định, còn những thuật toán sắp xếp khác (và nói chung những thuật toán sắp xếp đòi hỏi phải đảo giá trị 2 bản ghi ở vị trí bất kỳ) là không ổn định. Với phép đếm phân phối ở mục trước, ta nhận xét rằng nếu hai bản ghi có khoá sắp xếp bằng nhau thì khi đưa giá trị vào dãy bản ghi phụ, bản ghi nào vào trước sẽ nằm phía sau. Vậy nên ta sẽ đẩy giá trị các bản ghi vào dãy phụ theo thứ tự ngược để giữ được thứ tự tương đối ban đầu. Nói chung, mọi phương pháp sắp xếp tổng quát cho dù không ổn định thì đều có thể biến đổi để nó trở thành ổn định, phương pháp chung nhất được thể hiện qua ví dụ sau: Giả sử ta cần sắp xếp các sinh viên trong danh sách theo thứ tự giảm dần của điểm bằng một thuật toán sắp xếp ổn định. Ta thêm cho mỗi sinh viên một khoá Index là thứ tự ban đầu của Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc dữ liệu và Giải thuật 97 anh ta trong danh sách. Trong thuật toán sắp xếp được áp dụng, cứ chỗ nào cần so sánh hai sinh viên A và B xem anh nào phải đứng trước, trước hết ta quan tâm tới điểm số: Nếu điểm của A khác điểm của B thì anh nào điểm cao hơn sẽ đứng trước, nếu điểm số bằng nhau thì anh nào có Index nhỏ hơn sẽ đứng trước. Trong một số bài toán, tính ổn định của thuật toán sắp xếp quyết định tới cả tính đúng đắn của toàn thuật toán lớn. Chính tính nhanh của QuickSort và tính ổn định của phép đếm phân phối là cơ sở nền tảng cho hai thuật toán sắp xếp cực nhanh trên các dãy khoá số mà ta sẽ trình bày dưới đây. 8.10. THUẬT TOÁN SẮP XẾP BẰNG CƠ SỐ (RADIXSORT) Bài toán đặt ra là: Cho dãy khoá là các số tự nhiên k1, k2, …, kn hãy sắp xếp chúng theo thứ tự k ...
Nội dung trích xuất từ tài liệu:
BÀI GIẢNG GIẢI THUẬT VÀ LẬP TRÌNH - QUY HOẠCH ĐỘNG - LÊ MINH HOÀNG - 4 Cấu trúc dữ liệu và Giải thuật 95 thời gian thực hiện trung bình phức tạp hơn, ta chỉ ghi nhận một kết quả đã chứng minh được là độ phức tạp trung bình của HeapSort cũng là O(nlog2n). Có thể nhận xét thêm là QuickSort đệ quy cần thêm không gian nhớ cho Stack, còn HeapSort ngoài một nút nhớ phụ để thực hiện việc đổi chỗ, nó không cần dùng thêm gì khác. HeapSort tốt hơn QuickSort về phương diện lý thuyết bởi không có trường hợp tồi tệ nào HeapSort có thể mắc phải. Cũng nhờ có HeapSort mà giờ đây khi giải mọi bài toán có chứa mô-đun sắp xếp, ta có thể nói rằng độ phức tạp của thủ tục sắp xếp đó không quá O(nlog2n). 8.8. SẮP XẾP BẰNG PHÉP ĐẾM PHÂN PHỐI (DISTRIBUTION COUNTING) Có một thuật toán sắp xếp đơn giản cho trường hợp đặc biệt: Dãy khoá k1, k2, …, kn là các số nguyên nằm trong khoảng từ 0 tới M (TKey = 0..M). Ta dựng dãy c0, c1, …, cM các biến đếm, ở đây cV là số lần xuất hiện giá trị V trong dãy khoá: for V := 0 to M do cV := 0; {Khởi tạo dãy biến đếm} for i := 1 to n do cki := cki + 1; Ví dụ với dãy khoá: 1, 2, 2, 3, 0, 0, 1, 1, 3, 3 (n = 10, M = 3), sau bước đếm ta có: c0 = 2; c1 = 3; c2 = 2; c3 = 3. Dựa vào dãy biến đếm, ta hoàn toàn có thể biết được: sau khi sắp xếp thì giá trị V phải nằm từ vị trí nào tới vị trí nào. Như ví dụ trên thì giá trị 0 phải nằm từ vị trí 1 tới vị trí 2; giá trị 1 phải đứng liên tiếp từ vị trí 3 tới vị trí 5; giá trị 2 đứng ở vị trí 6 và 7 còn giá trị 3 nằm ở ba vị trí cuối 8, 9, 10: 0011122333 Tức là sau khi sắp xếp: Giá trị 0 đứng trong đoạn từ vị trí 1 tới vị trí c0. Giá trị 1 đứng trong đoạn từ vị trí c0 + 1 tới vị trí c0 + c1. Giá trị 2 đứng trong đoạn từ vị trí c0 + c1 + 1 tới vị trí c0 + c1 + c2. … Giá trị v trong đoạn đứng từ vị trí c0 + c1 + … + cv-1 + 1 tới vị trí c0 + c1 + c2 + … + cv. … Để ý vị trí cuối của mỗi đoạn, nếu ta tính lại dãy c như sau: for V := 1 to M do cV := cV-1 + cV Thì cV là vị trí cuối của đoạn chứa giá trị V trong dãy khoá đã sắp xếp. Muốn dựng lại dãy khoá sắp xếp, ta thêm một dãy khoá phụ x1, x2, …, xn. Sau đó duyệt lại dãy khoá k, mỗi khi gặp khoá mang giá trị V ta đưa giá trị đó vào khoá xcv và giảm cv đi 1. for i := n downto 1 do begin V := ki; XcV := ki; cV := cV - 1; end; Lê Minh Hoàng 96 Chuyên đề Khi đó dãy khoá x chính là dãy khoá đã được sắp xếp, công việc cuối cùng là gán giá trị dãy khoá x cho dãy khoá k. procedure DistributionCounting; {TKey = 0..M} var c: array[0..M] of Integer; {Dãy biến đếm số lần xuất hiện mỗi giá trị} x: TArray; {Dãy khoá phụ} i: Integer; V: TKey; begin for V := 0 to M do cV := 0; {Khởi tạo dãy biến đếm} for i := 1 to n do cki := cki + 1; {Đếm số lần xuất hiện các giá trị} for V := 1 to M do cV := cV-1 + cV; {Tính vị trí cuối mỗi đoạn} for i := n downto 1 do begin V := ki; xcV := ki; cV := cV - 1; end; k := x; {Sao chép giá trị từ dãy khoá x sang dãy khoá k} end; Rõ ràng độ phức tạp của phép đếm phân phối là O(max(M, n)). Nhược điểm của phép đếm phân phối là khi M quá lớn thì cho dù n nhỏ cũng không thể làm được. Có thể có thắc mắc tại sao trong thao tác dựng dãy khoá x, phép duyệt dãy khoá k theo thứ tự nào thì kết quả sắp xếp cũng như vậy, vậy tại sao ta lại chọn phép duyệt ngược từ dưới lên?. Để trả lời câu hỏi này, ta phải phân tích thêm một đặc trưng của các thuật toán sắp xếp: 8.9. TÍNH ỔN ĐỊNH CỦA THUẬT TOÁN SẮP XẾP (STABILITY) Một phương pháp sắp xếp được gọi là ổn định nếu nó bảo toàn thứ tự ban đầu của các bản ghi mang khoá bằng nhau trong danh sách. Ví dụ như ban đầu danh sách sinh viên được xếp theo thứ tự tên alphabet, thì khi sắp xếp danh sách sinh viên theo thứ tự giảm dần của điểm thi, những sinh viên bằng điểm nhau sẽ được dồn về một đoạn trong danh sách và vẫn được giữ nguyên thứ tự tên alphabet. Hãy xem lại nhưng thuật toán sắp xếp ở trước, trong những thuật toán đó, thuật toán sắp xếp nổi bọt, thuật toán sắp xếp chèn và phép đếm phân phối là những thuật toán sắp xếp ổn định, còn những thuật toán sắp xếp khác (và nói chung những thuật toán sắp xếp đòi hỏi phải đảo giá trị 2 bản ghi ở vị trí bất kỳ) là không ổn định. Với phép đếm phân phối ở mục trước, ta nhận xét rằng nếu hai bản ghi có khoá sắp xếp bằng nhau thì khi đưa giá trị vào dãy bản ghi phụ, bản ghi nào vào trước sẽ nằm phía sau. Vậy nên ta sẽ đẩy giá trị các bản ghi vào dãy phụ theo thứ tự ngược để giữ được thứ tự tương đối ban đầu. Nói chung, mọi phương pháp sắp xếp tổng quát cho dù không ổn định thì đều có thể biến đổi để nó trở thành ổn định, phương pháp chung nhất được thể hiện qua ví dụ sau: Giả sử ta cần sắp xếp các sinh viên trong danh sách theo thứ tự giảm dần của điểm bằng một thuật toán sắp xếp ổn định. Ta thêm cho mỗi sinh viên một khoá Index là thứ tự ban đầu của Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc dữ liệu và Giải thuật 97 anh ta trong danh sách. Trong thuật toán sắp xếp được áp dụng, cứ chỗ nào cần so sánh hai sinh viên A và B xem anh nào phải đứng trước, trước hết ta quan tâm tới điểm số: Nếu điểm của A khác điểm của B thì anh nào điểm cao hơn sẽ đứng trước, nếu điểm số bằng nhau thì anh nào có Index nhỏ hơn sẽ đứng trước. Trong một số bài toán, tính ổn định của thuật toán sắp xếp quyết định tới cả tính đúng đắn của toàn thuật toán lớn. Chính tính nhanh của QuickSort và tính ổn định của phép đếm phân phối là cơ sở nền tảng cho hai thuật toán sắp xếp cực nhanh trên các dãy khoá số mà ta sẽ trình bày dưới đây. 8.10. THUẬT TOÁN SẮP XẾP BẰNG CƠ SỐ (RADIXSORT) Bài toán đặt ra là: Cho dãy khoá là các số tự nhiên k1, k2, …, kn hãy sắp xếp chúng theo thứ tự k ...
Tìm kiếm theo từ khóa liên quan:
toán kinh tế kiến thức thống kê giáo trình đại học bài giảng chứng khoán đề cương ôn tập câu hỏi trắc nghiệmTài liệu liên quan:
-
Giáo trình phân tích một số loại nghiệp vụ mới trong kinh doanh ngân hàng quản lý ngân quỹ p5
7 trang 471 0 0 -
Giáo trình Toán kinh tế: Phần 1 - Trường ĐH Kinh doanh và Công nghệ Hà Nội (năm 2022)
59 trang 317 0 0 -
MARKETING VÀ QUÁ TRÌNH KIỂM TRA THỰC HIỆN MARKETING
6 trang 299 0 0 -
Đề cương học phần Toán kinh tế
32 trang 227 0 0 -
QUY CHẾ THU THẬP, CẬP NHẬT SỬ DỤNG CƠ SỞ DỮ LIỆU DANH MỤC HÀNG HÓA BIỂU THUẾ
15 trang 207 1 0 -
BÀI GIẢNG KINH TẾ CHÍNH TRỊ MÁC - LÊNIN - TS. NGUYỄN VĂN LỊCH - 5
23 trang 207 0 0 -
Giáo trình hướng dẫn phân tích các thao tác cơ bản trong computer management p6
5 trang 196 0 0 -
Giáo trình chứng khoán cổ phiếu và thị trường (Hà Hưng Quốc Ph. D.) - 4
41 trang 196 0 0 -
BÀI GIẢNG LÝ THUYẾT MẠCH THS. NGUYỄN QUỐC DINH - 1
30 trang 173 0 0 -
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG - NGÂN HÀNG ĐỀ THI HẾT HỌC PHẦN HỌC PHẦN: TOÁN KINH TẾ
9 trang 171 0 0