Tham khảo tài liệu ''giáo trình hình thành ứng dụng chế độ đánh giá giải thuật theo phương pháp tổng quan p3'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
bu y 1.6.2.3.2 Hàm nhân Một hàm f(n) gọi hàm nhân (multiplicative function) f(m.n) = f(m).f(n) với số nguyên dương m n Ví dụ 1-13: Hàm f(n) = nk hàm nhân, f(m.n) = (m.n)k = mk.nk = f(m) f(n) Tính nghiệm phương trình tổng quát trường hợp d(n) hàm nhân: Nếu d(n) (I.1) hàm nhân theo tính chất hàm nhân ta có d(bk-j) = [d(b)]k-j nghiệm riêng (I.2) k -1 ‡”a d(b ) = ‡”a [d(b)] j j= j k- j k- j = [d(b)]k j= a ] ‡”[ d(b) j= a k - [d(b)]k Hay nghiệm riêng = a -1 d(b) [ k -1 j = [d(b)]k a k ] -1 d(b) a -1 d(b) (I.3) Xét ba trường hợp sau: 1.- Trường hợp 1: a > d(b) cơng thức (I.3) ta có ak > [d(b)]k, theo quy tắc lấy độ phức tạp ta có nghiệm riêng O(ak) = O(nlogba) Như nghiệm riêng nghiệm T(n) O(nlogba) Trong trương hợp ta thấy thời gian thực phụ thuộc vào a, b mà không phụ thuộc vào hàm tiến triển d(n) Vì để cải tiến giải thuật ta cần giảm a tăng b 2.- Trường hợp 2: a < d(b) cơng thức (I.3) ta có [d(b)]k > ak, theo quy tắc lấy độ phức tạp ta cónghiệm riêng O([d(b)]k) = O(nlogbd(b)) Trong trường hợp nghiệm riêng lớn nghiệm nên T(n) O(nlogbd(b)) Ðể cải tiến giải thuật cần giảm d(b) tăng b Trường hợp đặc biệt quan trọng d(n) = n Khi d(b) = b logbb = Vì nghiệm riêng O(n) T(n) O(n) 3.- Trường hợp 3: a = d(b) cơng thức (I.3) khơng xác đinh nên ta phải tính trực tiếp nghiệm riêng: Nghiệm riêng = [d(b)]k k -1 ‡”[ j= a j k ] =a d(b) k -1 ‡”1 = akk (do a = d(b)) j= Do n = bk nên k = logbn ak = nlogba Vậy nghiệm riêng nlogbalogbn nghiệm lớn gấp logbn lần nghiệm Do T(n) O(nlogbalogbn) Chú ý giải phương trình đệ quy cụ thể, ta phải xem phương trình có thuộc dạng phương trình tổng qt hay khơng Nếu có phải xét xem hàm tiến triển có phải hàm nhân khơng Nếu có ta xác định a, d(b) dựa vào so sánh a d(b) mà vận dụng ba trường hợp nói Nguyễn Văn Linh Trang 14 to k d o m o c k -1 w N O W ! PD m w o c u -tr a c k h a n g e Vi e lic O W N y bu to k lic C Kĩ thuật phân tích giải thuật w w d o XC er Giải thuật w w w F- w C h a n g e Vi e ! XC er PD F- c u -tr a c k c bu y Ví dụ 1-14: Giải phương trình đệ quy sau với T(1) = n 1/- T(n) = 4T( ) + n n 2/- T(n) = 4T( ) + n2 n 3/- T(n) = 4T( ) + n3 Các phương trình cho có dạng phương trình tổng quát, hàm tiến triển d(n) hàm nhân a = 4, b = Với phương trình thứ nhất, ta có d(n) = n => d(b) = b = < a, áp dụng trường hợp ta có T(n) = O(nlogba) = O(nlog4) = O(n2) Với phương trình thứ hai, d(n) = n2 => d(b) = b2 = = a, áp dụng trường hợp ta có T(n) = O(nlogbalogbn) = O(nlog4logn) = O(n2logn) Với phương trình thứ 3, ta có d(n) = n3 => d(b) = b3 = > a, áp dụng trường hợp 2, ta có T(n) = O(nlogbd(b)) = O(nlog8) = O(n3) 1.6.2.3.3 Các hàm tiến triển khác Trong trường hợp hàm tiến triển hàm nhân khơng thể áp dụng cơng thức ứng với ba trường hợp nói mà phải tính trực tiếp nghiệm riêng, sau so sánh với nghiệm để lấy nghiệm lớn hai nghiệm làm nghiệm phương trình Ví dụ 1-15: Giải phương trình đệ quy sau : T(1) = n T(n) = 2T( ) + nlogn Phương trình cho thuộc dạng phương trình tổng quát d(n) = nlogn hàm nhân Ta có nghiệm = nlogba = nlog2 = n Do d(n) = nlogn hàm nhân nên ta phải tính nghiệm riêng cách xét trực tiếp k -1 j j= k -1 k -1 ‡”a d (b ) = ‡”2 k- j j j= k- j log2 k - j = 2k ‡”(k - j) = k j= k ( k + 1) = O(2kk2) Theo giả thiết phương trình tổng quát n = bk nên k = logbn, b = nên 2k = n k = logn, có nghiệm riêng O(nlog2n), nghiệm lớn nghiệm T(n) = O(nlog2n) Nguyễn Văn Linh Trang 15 to k d o m o c Nghiệm riêng = w N O W ! PD m w o c u -tr a c k h a n g e Vi e lic O W N y bu to k lic C Kĩ thuật phân tích giải thuật w w d o XC er Giải thuật w w w F- w C h a n g e Vi e ! XC er PD F- c u -tr a c k c bu y 1.7 TỔNG KẾT CHƯƠNG Trong chương này, cần phải nắm vững ý sau: 1.- Sự phân tích, đánh giá giải thuật cần thiết để lựa chọn giải thuật tốt, để cải tiến giải thuật 2.- Sử dụng khái niệm độ phức tạp ký hiệu ô lớn để đánh giá giải thuật 3.- Đối với chương trình khơng gọi chương trình con, dùng quy tắc cộng, quy tắc nhân quy tắc chung để phân tích, tính độ phức tạp 4.- Đối với chương trình gọi chương trình con, tính độ phức tạp theo nguyên tắc “từ ra” 5.- Đối với chương trình đệ quy trước hết phải thành lập phương trình đệ quy, sau giải phương trình đệ quy, nghiệm phương trình đệ quy độ phức tạp giải thuật 6.- Khi giải phương trình đệ quy khơng thuộc dạng phương trình tổng qt sử dụng phương pháp truy hồi phương pháp đoán nghiệm 7.- Khi giải phương trình đệ quy thuộc dạng phương trình tổng quát, hàm tiến triển d(n) hàm nhân vận dụng cơng thức nghiệm môt ba trường hợp để xác định nghiệm, cịn d(n) khơng phải hàm nhân phải tính trực tiếp nghiệm riêng so sánh với nghiệm để chọn nghiệm BÀI TẬP CHƯƠNG Bài 1: Tính thời gian thực đoạn chương trình sau: a) Tính tổng số Sum := 0; for i:=1 to n begin readln(x); Sum := Sum + x; end; b) Tính tích hai ma trận vuông cấp n C = A*B: {1} {2} {3} {4} {5} for i := to n for j := to n begin c[i,j] := 0; for k := to n c[i,j] := c[i,j] + a[i,k] * b[k,j]; end; Bài 2: Giải phương trình đệ quy sau với T(1) = a) T(n) = 3T(n/2) + n b) T(n) = 3T(n/2) + n2 c) T(n) = 8T(n/2) + n3 Bài 3: Giải phương trình đệ quy sau với T(1) = a) T(n) = 4T(n/3) + n b) T(n) = 4T(n/3) + n2 Nguyễn Văn Linh Trang 16 to k d o m o c {1} {2} {3} {4} w N O W ! PD m w o c u -tr a c k h a n g e Vi e lic O W N y bu to k lic C Kĩ thuật phân tích giải thuật w w d o XC er Giải thuật w w w F- w C h a n g e Vi e ! XC er PD F- c u -tr a c k c h a n g e Vi e c u -tr a c k w N c c) T(n) = 9T(n/3) + n2 Bài 4: Giải phương trình đệ quy sau với T(1) = a) T(n) = T(n/2) + b) T(n) = 2T(n/2) + logn c) T(n) = 2T(n/2) + n d) T(n) = 2T(n/2) + n2 Bài 5: Giải phương trình đệ quy sau phương pháp đoán nghiệm: a) T(1) = T(n) = 2T(n-1) + với n > b) T(1) = T(n) = 2T(n-1) + n với n > Bài 6: Cho mảng n số nguyên thứ tự tăng Viết hàm tìm số ngun mảng theo phương pháp tìm kiếm nhị phân, tìm thấy trả TRUE, ngược lại trả FALSE Sử dụng hai kĩ thuật đệ quy vòng lặp Với kĩ thuật viết hàm tìm tính thời gian thực hàm Bài 7: Tính thời gian thực giải thuật đệ quy giải toán Tháp Hà nội với n tầng? Bài 8: Xét công thức truy tốn để tính số tổ hợp chập k n sau: C kn = nêu k = hoac k = n C kn 11 + C nk -1 nêu < k < n a) Viết hàm đệ quy để tính số tổ hợp chập k n b) Tính thời gian thực giải thuật nói Nguyễn Văn Linh Trang 17 y bu to k lic d o m o m w o d o w w w Kĩ thuật phân tích giải thuật w w C lic k to Giải thuật C bu y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c F- w y CHƯƠNG 2: SẮP XẾP 2.1 TỔNG QUAN 2.1.1 Mục tiêu Chương trình bày số phương pháp xếp Với phương pháp cần nắm vững phần sau: - Giải thuật xếp - Minh họa việc xếp theo giải thuật - Chương trình xếp - Đánh giá giải thuật 2.1.2 Kiến thức cần thiết Các kiến thức cần thiết để học chương bao gồm: - Cấu trúc liệu kiểu mẩu tin (record) kiểu mảng (array) mẩu tin - Kiểu liệu trừu tượng danh sách thủ tục xen phần tử vào danh sách (insert) - Kĩ thuật lập trình lập trình đệ quy 2.1.3 Tài liệu tham khảo A.V Aho, J.E Hopcroft, J.D Ullman Data Structures and Algorithms Addison-Wesley 1983 (Chapter 8) Jeffrey H Kingston; Algorithms and Data Structures; Addison-Wesley; 1998 (Chapter 9) Đinh Mạnh Tường Cấu trúc liệu & Thuật toán Nhà xuất khoa học kĩ thuật Hà nội-2001 (Chương 9) Đỗ Xuân Lôi Cấu trúc liệu & Giải thuật 1995 (Chương 9) 2.1.4 Nội dung cốt lõi Trong chương nghiên cứu vấn đề sau: • Bài tốn xếp • Một số giải thuật xếp đơn giản • QuickSort • HeapSort • BinSort Nguyễn Văn Linh Trang 18 k lic d o o w m C Sắp xếp o m Giải thuật c to bu y bu to k lic C c u -tr ack w w d o w w w w N O W ! h a n g e Vi e N O W XC er PD h a n g e Vi e ! XC er PD F- c u -tr a c k c F- w y 2.2 BÀI TOÁN SẮP XẾP 2.2.1 Tầm quan trọng toán xếp Sắp xếp danh sách đối tượng theo thứ tự toán thường vận dụng ứng dụng tin học Ví dụ ta cần xếp danh sách thí sinh theo tên với thứ tự Alphabet, xếp danh sách sinh viên theo điểm trung bình với thứ tự từ cao đến thấp Một ví dụ khác cần tìm kiếm đối tượng danh sách đối tượng giải thuật tìm kiếm nhị phân danh sách đối tượng phải xếp trước Tóm lại xếp yêu cầu thiếu thiết kế phần mềm Do việc nghiên cứu phương pháp xếp cần thiết để vận dụng lập trình 2.2.2 Sắp xếp xếp Sắp xếp xếp liệu tổ chức nhớ máy tính, ta sử dụng khả truy nhập ngẫu nhiên nhớ thực nhanh Sắp xếp xếp sử dụng số lượng đối tượng cần xếp lớn lưu trữ nhớ mà phải lưu trữ nhớ Cụ thể ta xếp liệu lưu trữ tập tin Chương tập trung giải vấn đề xếp xếp nghiên cứu chương IV 2.2.3 Tổ chức liệu ngôn ngữ cài đặt Các đối tượng cần xếp mẩu tin gồm nhiều trường Một trường gọi khóa (key), kiểu kiểu có quan hệ thứ tự (như kiểu số nguyên, số thực, chuỗi ký tự ) Danh sách đối tượng cần xếp mảng mẩu tin vừa nói Mục đích việc xếp tổ chức lại mẩu tin cho khóa chúng thứ tự tương ứng với quy luật xếp Ðể trình bày ví dụ minh họa dùng PASCAL làm ngôn ngữ thể sử dụng khai báo sau: CONST N = 10; TYPE KeyType = integer; OtherType = real; VAR RecordType = Record Key : KeyType; OtherFields : OtherType; end; a : array[1 N] of RecordType; Nguyễn Văn Linh Trang 19 k lic d o o w m C m Sắp xếp o Giải thuật c to bu y bu to k lic C c u -tr ack w w d o w w w w N O W ! h a n g e Vi e N O W XC er PD h a n g e Vi e ! XC er PD F- c u -tr a c k c F- w y PROCEDURE VAR temp BEGIN temp x := y := END; Swap(var x,y:RecordType); : RecordType; := x; y; temp; Cần thấy thủ tục Swap lấy O(1) thời gian thực lệnh gán nối tiếp 2.3 CÁC PHƯƠNG PHÁP SẮP XẾP ÐƠN GIẢN Các giải thuật đơn giản thường lấy O(n2) thời gian để xếp n đối tượng giải thuật thường dùng để danh sách có đối tượng Với giải thuật nghiên cứu phần: giải thuật, ví dụ, chương trình phân tích đánh giá 2.3.1 Sắp xếp chọn (Selection Sort) 2.3.1.1 Giải thuật Ðây phương pháp xếp đơn giản tiến hành sau: • Ðầu tiên chọn phần tử có khóa nhỏ n phần tử từ a[1] đến a[n] hốn vị với phần tử a[1] • Chọn phần tử có khóa nhỏ n-1phần tử từ a[2] đến a[n] hốn vị với a[2] • Tổng quát bước thứ i, chọn phần tử có khố nhỏ n-i+1 phần tử từ a[i] đến a[n] hốn vị với a[i] • Sau n-1 bước mảng xếp Phương pháp gọi phương pháp chọn lặp lại q trình chọn phần tử nhỏ số phần tử chưa Ví dụ 2-1: Sắp xếp mảng gồm 10 mẩu tin có khóa số nguyên: 5, 6, 2, 2, 10, 12, 9, 10, Bước 1: Ta chọn phần tử có khố nhỏ (bằng 2) phần tử từ a[1] đến a[10] a[3], hoán đổi a[1] a[3] cho Sau bước a[1] có khố nhỏ Bước 2: Ta chọn phần tử có khố nhỏ (bằng 2) phần tử từ a[2] đến a[10] a[4], hoán đổi a[2] a[4] cho Tiếp tục trình sau bước kết thúc Bảng sau ghi lại giá trị khoá tương ứng với bước Nguyễn Văn Linh Trang 20 k lic d o o w m C m o Sắp xếp c to bu y bu k to Giải thuật lic C c u -tr ack w w d o w w w w N O W ! h a n g e Vi e N O W XC er PD h a n g e Vi e ! XC er PD F- c u -tr a c k c F- w y Khóa Bước Ban đầu Bước Bước Bước Bước Bước Bước Bước Bước Bước Kết a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] 6 2 5 2 6 10 10 10 10 10 12 12 12 12 12 12 9 9 9 12 10 10 10 10 10 10 10 10 10 2 9 10 9 9 9 12 12 10 10 3 10 10 10 10 12 12 Hình 2-1: Sắp xếp chọn 2.3.1.2 Chương trình: PROCEDURE SelectionSort; VAR i,j,LowIndex: integer; LowKey: KeyType; BEGIN {1} FOR i := TO n-1 DO BEGIN {2} LowIndex := i; {3} LowKey := a[i].key; {4} FOR j := i+1 TO n DO {5} IF a[j].key < LowKey THEN BEGIN {6} LowKey := a[j].key; {7} LowIndex := j; END; {8} Swap(a[i],a[LowIndex]); END; END; 2.3.1.3 Ðánh giá: Phương pháp xếp chọn lấy O(n2) để xếp n phần tử Trước hết ta có thủ tục Swap lấy thời gian nói mục 2.2.3 Các lệnh {2}, {3} lấy O(1) thời gian Vòng lặp for {4} – {7} thực n-i lần, j chạy từ i+1 đến n, lần lấy O(1), nên lấy O(n-i) thời gian Do thời gian tổng cộng là: n -1 T(n) = ‡”(n - i) = i =1 n(n - 1) tức O(n2) 2.3.2 Sắp xếp xen (Insertion Sort) 2.3.2.1 Giải thuật Trước hết ta xem phần tử a[1] dãy có thứ tự Nguyễn Văn Linh Trang 21 k lic d o o w m C Sắp xếp o m Giải thuật c to bu y bu to k lic C c u -tr ack w w d o w w w w N O W ! h a n g e Vi e N O W XC er PD h a n g e Vi e ! XC er PD F- c u -tr a c k c F- w y • Bước 1, xen phần tử a[2] vào danh sách có thứ tự a[1] cho a[1], a[2] danh sách có thứ tự • Bước 2, xen phần tử a[3] vào danh sách có thứ tự a[1], a[2] cho a[1], a[2], a[3] danh sách có thứ tự • Tổng qt, bước i, xen phần tử a[i+1] vào danh sách có thứ tự a[1],a[2], a[i] cho a[1], a[2], a[i+1] danh sách có thứ tự • Phần tử xét a[j] xen vào vị trí thích hợp danh sách phần tử trước a[1],a[2], a[j-1] cách so sánh khoá a[j] với khố a[j-1] đứng trước Nếu khố a[j] nhỏ khố a[j-1] hốn đổi a[j-1] a[j] cho tiếp tục so sánh khoá a[j-1] (lúc a[j-1] chứa nội dung a[j]) với khố a[j-2] đứng trước Ví dụ 2-2: Sắp xếp mảng gồm 10 mẩu tin cho ví dụ 2-1 Bước 1: Xen a[2] vào dãy có phần tử a[1] ta dãy hai phần tử a[1] a[2] có thứ tự Việc xen thực khơng phải làm hai phần tử a[1], a[2] có khố tương ứng có thứ tự Bước 2: Xen a[3] vào dãy a[1] a[2] ta dãy ba phần tử a[1] a[3] có thứ tự Việc xen thực cách : so sánh khoá a[3] với khoá a[2], khoá a[3] nhỏ khoá a[2] (2