1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình hình thành quá trình đánh giá kĩ thuật giải thuật theo phương pháp tổng quan p2 doc

15 282 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 15
Dung lượng 1,4 MB

Nội dung

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 ‡” = 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 qt, 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 qt d(n) = nlogn khơng phải 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 ‡” - j) = k (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 quát 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 vng 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 đố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: Ck = n nêu k = hoac k = n k C k + C n -1 nêu < k < n n1 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 TỐN SẮP XẾP 2.2.1 Tầm quan trọng tốn xếp Sắp xếp danh sách đối tượng theo thứ tự tố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 ngồi 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 cịn xếp ngồi 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 qt 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 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 quát, 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 khoá 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 khoá 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 R Khi L điểm phân hoạch, cụ thể a[L] phần tử mảng “bên phải” Nguyễn Văn Linh Trang 25 to k lic d o m w o c C m Sắp xếp o Giải thuật 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.4.2.3 Giải thuật QuickSort Ðể xếp mảng a[i] a[j] ta tiến hành bước sau: • Xác định chốt • Phân hoạch mảng cho thành hai mảng a[i] a[k-1] a[k] a[j] • Sắp xếp mảng a[i] a[k-1] (Ðệ quy) • Sắp xếp mảng a[k] a[j] (Ðệ quy) Quá trình đệ quy dừng khơng cịn tìm thấy chốt Ví dụ 2-4: Sắp xếp mảng gồm 10 mẩu tin có khóa số nguyên: 5, 8, 2, 10, 5, 12, 8, 1, 15 Với mảng a[1] a[10], hai phần tử có khóa khác là a[1] a[2] với khoá tương ứng 8, ta chọn chốt v = Để phân hoạch, khởi đầu ta cho L := (đặt L cực trái) R := 10 (đặt R cực phải) Do a[L] có khố nhỏ chốt nên L := L+1 = (di chuyển L sang phải), lúc a[L] có khố = chốt nên dừng lại Do a[R] có khố nhỏ chốt nên R không chuyển sang trái Tại điểm dừng L R ta có L < R (L=2 R=10) nên hốn đổi a[L] a[R] (a[2] a[10]) cho Sau hốn đổi, a[L] lại có khố nhỏ chốt nên di chuyển L sang phải (L := L+1 = 3) Khoá a[L] nhỏ chốt nên lại di chuyển L sang phải (L := L+1 = 4) Khoá a[L] 10 lớn chốt nên dừng lại Với R, khoá a[R] chốt nên di chuyển R sang trái (R := R-1 = 9) Khoá a[R] 15 lớn chốt nên di chuyển R sang trái (R := R-1 = 8) Khoá a[R] nhỏ chốt nên dừng lại Tại điểm dừng L R ta có L < R (L=4 R=8) nên hoán đổi a[L] a[R] (a[4] a[8]) cho Sau hốn đổi, a[L] có khố nhỏ chốt nên di chuyển L sang phải (L := L+1 = 5) Khoá a[L] nhỏ chốt nên lại di chuyển L sang phải (L := L+1 = 6) Khoá a[L] 12 lớn chốt nên dừng lại Với R, khoá a[R] 10 lớn chốt nên di chuyển R sang trái (R := R1 = 7) Khoá a[R] chốt nên di chuyển R sang trái (R := R-1 = 6) Khoá a[R] 12 lớn chốt nên di chuyển R sang trái (R := R-1 = 5) Khoá a[R] nhỏ chốt nên dừng lại Tại điểm dừng L R ta có L > R (L=6 R=5) nên ta xác định điểm phân hoạch ứng với L = Tức mảng cho ban đầu phân thành hai mảng bên trái a[1] a[5] mảng bên phải a[6] a[10] Hình ảnh phân hoạch biểu diễn hình sau: Chỉ số Khố Ban đầu 10 5 12 8 15 10 15 10 v=8 Cấp 5 12 10 Hình 2-4 : Chọn chốt phân hoạch mảng a[1] a[10] Trong bảng trên, dòng số ghi số phần tử mảng (từ đến 10) Nguyễn Văn Linh Trang 26 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 Trong dịng khố ban đầu, giá trị khố dịng (5, 8, 2, 10, 5, 12, 8, 1, 15 4) giá trị khoá mảng cho ban đầu, giá trị khố dịng (4, 1, 10 8) giá trị khoá sau thực hoán đổi a[2] với a[10] a[4] với a[8] Giá trị chốt v = Dòng cấp cấp 1, biểu diễn hai mảng sau phân hoạch Mảng bên trái từ a[1] đến a[5] gồm phần tử có khố 5, 4, 2, Mảng bên phải từ a[6] đến a[10] gồm phần tử có khố 12, 8, 10, 15 Tiếp tục xếp đệ quy cho mảng bên trái mảng bên phải Với mảng bên trái a[1] a[5], hai phần tử có khóa khác là a[1] a[2] với khoá tương ứng 4, ta chọn chốt v = Để phân hoạch, khởi đầu ta cho L := (đặt L cực trái) R := (đặt R cực phải) Do a[L] có khố chốt nên khơng thể di chuyển L Do a[R] có khố chốt nên di chuyển R sang trái (R := R-1 = 4) Khoá a[R] nhỏ chốt nên dừng lại Tại điểm dừng L R ta có L < R (L= R=4) nên hoán đổi a[L] a[R] (a[1] a[4]) cho Sau hốn đổi, a[L] lại có khố nhỏ chốt nên di chuyển L sang phải (L := L+1 = 2) Khoá a[L] nhỏ chốt nên lại di chuyển L sang phải (L := L+1 = 3) Khoá a[L] nhỏ chốt nên lại di chuyển L sang phải (L := L+1 = 4) Khoá a[L] chốt nên dừng lại Với R, khoá a[R] chốt nên di chuyển R sang trái (R := R-1 = 4) Khoá a[R] chốt nên di chuyển R sang trái (R := R-1 = 3) Khoá a[R] nhỏ chốt nên dừng lại Tại điểm dừng L R ta có L > R (L=4 R=3) nên ta xác định điểm phân hoạch ứng với L = Tức mảng bên trái phân thành hai mảng bên trái a[1] a[3] mảng bên phải a[4] a[6] Hình ảnh phân hoạch biểu diễn hình sau: Chỉ số Khoá Ban đầu 10 5 12 8 15 10 15 10 v=8 Cấp Cấp 5 1 12 10 v=5 5 Hình 2-5 : Chọn chốt phân hoạch mảng a[1] a[5] Tiếp tục xếp cho mảng cấp mảng bên phải mảng ban đầu dừng (các mảng khơng có chốt) Cuối ta có mảng thứ tự Hình sau biểu diễn tồn q trình xếp .Nguyễn Văn Linh Trang 27 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 Chỉ số Khoá Ban đầu Cấp Cấp Cấp Cấp Kết 10 5 12 8 1 v=5 2 v=4 v=2 xong xong xong 5 xong 10 10 v=8 12 15 8 10 15 12 v = 12 10 15 v = 10 8 10 xong xong 8 10 12 12 15 v =15 12 15 xong xong 12 15 Hình 2-6 : QuickSort 2.4.3 Cài đặt giải thuật 2.4.3.1 Hàm FindPivot Ta thiết kế hàm FindPivot để xác định dãy a[i] a[j] có hay khơng hai phần tử có khóa khác Nếu khơng tìm thấy hai phần tử có khóa khác trả giá trị (khơng tìm thấy chốt), ngược lại hàm trả giá trị số phần tử có khóa lớn hai phần tử có khóa khác Khóa lớn trở thành phần tử chốt mà ta xác định thủ tục QuickSort Ðể tiện so sánh ta sử dụng biến FirstKey để lưu giữ khóa phần tử mảng a[i] a[j] (FirstKey a[i].key) Ta dùng số k để dị tìm mảng a[i] a[j], kể từ vị trí i+1 đến hết mảng, phần tử a[k] mà a[k].key FirstKey Nếu khơng tìm thấy a[k] mảng gồm phần tử gồm nhiều phần tử có khóa Trong trường hợp khơng tìm thấy chốt hàm FindPivot trả Ngược lại ta phải xét xem a[k].key có lớn FirstKey hay khơng, chốt khóa a[k] hàm FindPivot trả k, khơng chốt khố a[i] hàm FindPivot trả i FUNCTION FindPivot(i,j:integer): integer; VAR FirstKey : KeyType; k : integer; BEGIN {1} k := i+1; {2} FirstKey := a[i].key; {3} WHILE (k j THEN FindPivot := ELSE Nguyễn Văn Linh Trang 28 k lic d o o w m C m o Sắp xếp c to bu y bu to k 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 ... 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. .. 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. .. đệ quy khơng thuộc dạng phương trình tổng quát 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

Ngày đăng: 13/08/2014, 11:20

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN