Tìm hiểu về Thuật Toán Sắp Xếp

48 314 0
Tìm hiểu về Thuật Toán Sắp Xếp

Đ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

http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp OBO OK S CO M Nghiên cứu khoa học NGHIÊN CỨU KHOA HỌC KIL Đề tài : Tìm hiểu Thuật Tốn Sắp Xếp Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp Mục lục KIL OBO OKS CO M NGHIÊN CỨU KHOA HỌC Đề tài : Tìm hiểu Thuật Tốn Sắp Xếp Mục lục PHẦN MỞ ĐẦU Lý chọn đề tài Mục tiêu nhiệm vụ Chương MỘT SỐ KIẾN THỨC CƠ SỞ 1.1 Thuật tốn 1.1.1 Khái niệm thuật tốn 1.1.2 Các đặc trưng thuật tốn Chương MƠ PHỎNG THUẬT TỐN 10 2.1 Tổng quan mơ thuật tốn 10 2.1.1 Khái niệm mơ thuật tốn 10 2.1.2 Lịch sử mơ thuật tốn 11 2.1.3 Tác dụng mơ thuật tốn 14 2.1.4 Kiến trúc hệ thống mơ thuật tốn 18 2.1.5 Lựa chọn cơng cụ mơ thuật tốn 20 2.2 Một số u cầu mơ thuật tốn 21 2.2.1 Mơ tả theo thuật tốn 21 2.2.2 Hệ thống mơ phải thực theo bước 21 2.2.3 Mơ thuật tốn phải có tính động 21 2.2.4 Phải tạo phân cấp cho người học 22 2.2.5 Cấu trúc mơ thuật tốn 22 2.3 Quy trình thiết kế nhiệm vụ mơ thuật tốn 23 2.3.1 Nghiên cứu phân tích giải thuật 23 2.3.2 Phân tích giải thuật thành nhiều bước, sau mơ bước 26 2.3.3 Phân tích khả tổng hợp bước phân tích thành giải thuật 27 2.3.4 Phân tích khó khăn thuận lợi với người lần biết đến giải thuật 27 2.4 Kết luận 28 Chương3 : CHƯƠNG TRÌNH ỨNG DỤNG THUẬT TỐN SẮP XẾP 29 3.1 CÁC THUẬT TỐN SẮP XẾP ĐƠN GIẢN 30 3.1.1 Sắp xếp lựa chọn 30 3.1.2 Sắp xếp xen vào 32 3.1.3 Sắp xếp bọt 33 3.2 Sắp xếp hòa nhập 35 Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học Sắp xếp nhanh 38 Sắp xếp sử dụng thứ tự phận 45 KIL OBO OKS CO M 3.3 3.4 THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp PHẦN MỞ ĐẦU KIL OBO OKS CO M Lý chọn đề tài Trong hai thập kỷ qua, mơ thuật tốn nhà sư phạm ngành cơng nghệ thơng tin sử dụng cơng cụ có tính chất giúp đỡ việc dạy thuật tốn đồ thị, thuật tốn xếp, … khác máy tính Ngun nhân việc mơ thuật tốn sử dụng cơng cụ trợ giúp cho việc giảng dạy cung cấp mơ động đồ họa thuật tốn thay đổi cấu trúc liệu suốt q trình thực thi Như phần q trình học thuật tốn, sinh viên ngành cơng nghệ thơng tin học cấu trúc trình biên dịch (compiler) ngơn ngữ lập trình cho q trình Điều cho nhiệm vụ giai đoạn khác trình biên dịch Hiện nay, số hệ thống mơ thuật tốn phát triển sau hai thập kỷ Hầu hết thuật tốn đề cập đến giai đoạn hệ thống phổ biến tinh vi hệ thống mà thực tế sử dụng Mơ thuật tốn ngày trở nên hữu ích trở thành giáo cụ trực quan quan trọng hầu hết lĩnh vực, mơi trường giáo dục Với nhà sư phạm ngành cơng nghệ thơng tin mơ thuật tốn có tác dụng tài liệu hướng dẫn việc dạy thuật tốn máy tính Đặc biệt, giúp học sinh sinh viên hiểu cấu trúc liệu thuật tốn nhanh Như vậy, mơ thuật tốn góp phần to lớn vào việc ứng dụng CNTT giảng dạy góp phần vào phát triển nhanh chóng hệ thống elearning Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp Thuật tốn xếp đa dạng phong phú Vì vấn đề “ Mơ thuật tốn xếp ” chọn để nghiên cứu khóa luận KIL OBO OKS CO M Mục tiêu nhiệm vụ • Nghiên cứu tổng quan mơ thuật tốn • Hướng đến kỹ thuật lập trình với mã nguồn mở ngơn ngữ lập trình C# • Áp dụng kết nghiên cứu làm demo mơ thuật tốn xếp Cấu trúc khóa luận Chương 1: Một số kiến thức sở • Trình bày khái niệm thuật tốn, đặc trưng thuật tốn • Độ phức tạp thuật tốn Chương 2: Mơ thuật tốn • Tổng quan mơ thuật tốn • Một số u cầu mơ thuật tốn • Quy trình thiết kế nhiệm vụ mơ thuật tốn Chương 3: Chương trình ứng dụng thuật tốn xếp Phân tích thiết kế hệ thống mơ thuật tốn xếp • Phân tích số thuật tốn Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp KIL OBO OKS CO M Chương MỘT SỐ KIẾN THỨC CƠ SỞ 1.1 Thuật tốn 1.1.1 Khái niệm thuật tốn Thuật ngữ “algorithm” (thuật tốn gọi giải thuật) gọi theo tên nhà tốn học Ả rập kỷ IX al-Khowarizmi, người viết sách chữ số Hindu – sở kí hiệu số thập phân đại (xem [4], trang 118) Xuất xứ ban đầu từ algorism, dùng để quy tắc thực phép tính số học số thập phân Sau đó, vào kỷ XVIII algorism biến thành algorithm Với quan tâm ngày tăng máy tính, khái niệm thuật tốn cho ý nghĩa chung hơn, bao hàm thủ tục xác định để giải tốn, khơng phải thủ tục để thực phép tính số học Thuật tốn dãy hữu hạn thao tác xếp theo trình tự xác định cho sau thực dãy thao tác ấy, từ Input tốn ta nhận Output cần tìm Cũng xem thuật tốn cơng cụ để giải tốn cụ thể Phát biểu tốn định tổng qt mối quan hệ Input/Output cần thiết Thuật tốn mơ tả thủ tục tính tốn cụ thể để đạt mối quan hệ Input/Output Vào khoảng năm 1930 - 1936, nhà tốn học K.Gưdel, S Kleene, A Church, A Turing đề số định nghĩa khác cho Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp khái niệm thuật tốn Trong số định nghĩa tốn học khác (nhưng tương đương) thuật tốn, khái niệm Máy Turing (1937) Hàm đệ KIL OBO OKS CO M quy (1931-1936) sử dụng rộng rãi có nhiều thuận tiện cho nghiên cứu lí thuyết lẫn thực hành 1.1.2 Các đặc trưng thuật tốn Các thuật tốn có số tính chất chung, là: • Đầu vào (Input): Một thuật tốn có giá trị đầu vào từ tập xác định • Đầu (Output): Từ tập giá trị đầu vào, thuật tốn tạo giá trị đầu Các giá trị đầu nghiệm tốn • Tính xác định: Các bước thuật tốn phải xác định cách xác • Tính đắn: Một thuật tốn phải cho giá trị đầu tập giá trị đầu vào • Tính hữu hạn: Một thuật tốn phải tạo giá trị đầu sau số hữu hạn (có thể lớn) bước thực tập đầu vào • Tính hiệu quả: Mỗi bước thuật tốn phải thực cách xác khoảng thời gian chấp nhận Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp • Tính tổng qt: Thuật tốn cần phải áp dụng cho tập liệu đầu vào tốn, khơng phải cho tập KIL OBO OKS CO M đặc biệt giá trị đầu vào 1.2.Độ phức tạp thuật tốn Cần ý thuật tốn giải lớp tốn đó, có nhiều thuật tốn khác giải tốn Một vấn đề đặt ta cần chọn thuật tốn tốt để giải tốn cho Nhưng thuật tốn tốt? Thước đo hiệu thời gian máy tính sử dụng để giải tốn theo thuật tốn xét giá trị đầu vào có kích thước xác định, dung lượng nhớ đòi hỏi để thực thuật tốn Như xem xét đến độ phức tạp tính tốn thuật tốn ta phải xem xét đến độ phức tạp thời gian độ phức tạp khơng gian Độ phức tạp khơng gian gắn liền với cấu trúc liệu cụ thể dùng để thực thuật tốn Độ phức tạp thời gian: Độ phức tạp thời gian thuật tốn biểu diễn qua số phép tốn thực thuật tốn giá trị đầu vào có kích thước xác định Độ phức tạp trường hợp xấu trường hợp phải dùng tối đa phép tốn để giải tốn theo thuật tốn xét Độ phức tạp trường hợp trung bình, trường hợp ta phải tìm số trung bình phép tốn để giải tốn tồn giá trị đầu vào có kích thước cho Các thuật ngữ thường dùng cho độ phức tạp thuật tốn: O(1): Độ phức tạp số Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp O(logn): Độ phức tạp lơgarit O(n): Độ phức tạp tuyến tính KIL OBO OKS CO M O(nlogn): Độ phức tạp nlogn O(nb): Độ phức tạp đa thức O(bn), b > 1: Độ phức tạp hàm mũ O(n!): Độ phức tạp giai thừa Sinh viên thực hiện:Nguyễn Hải Nam http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp KIL OBO OKS CO M Chương MƠ PHỎNG THUẬT TỐN 2.1 Tổng quan mơ thuật tốn 2.1.1 Khái niệm mơ thuật tốn Mơ thuật tốn q trình tách liệu, thao tác, ngữ nghĩa tạo mơ đồ họa cho q trình [Stasko 1990] (xem [23]) Mơ thuật tốn thiết kế để giúp người dùng hiểu thuật tốn, đánh giá chương trình sửa lỗi chương trình Một chương trình máy tính chứa cấu trúc liệu thuật tốn mà thực thi Trong q trình thực thi chương trình, giá trị sở liệu thay đổi Mơ thuật tốn sử dụng biểu diễn đồ họa để biểu diễn cấu trúc liệu thay đổi giá trị sở liệu trạng thái Thơng qua đó, người sử dụng xem bước thực thi chương trình nhờ hiểu chi tiết thuật tốn Mơ thuật tốn dùng để đánh giá chương trình có cách cung cấp mơ cho thành phần hệ thống, nhờ kiểm tra hiệu hệ thống Bên cạnh việc giúp người sử dụng hiểu hệ thống, mơ thuật tốn dùng để giúp thực q trình dò lỗi dễ dàng Để sử dụng mơ thuật tốn q trình dò lỗi chương trình, người sử dụng thích vào trạng thái chương trình để tạo lệnh mơ phỏng, sau chúng đưa vào hệ thống mơ thuật tốn để tạo mơ Người sử dụng xem chương trình họ thực nào, giá trị liệu bước bước ảnh hưởng Sinh viên thực hiện:Nguyễn Hải Nam 10 http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp tục lặp lại q trình mơ tả đoạn đầu A[0 i], với i = n-3, …,1, ta thu mảng Ta có hàm xếp bọt sau: KIL OBO OKS CO M void BubbleSort( Item A[] , int n) { (1) for (int i = n-1 ; i > ; i ) (2) for (int k = ; k < i ; k++) (3) if ( A[k].key > A[k+1].key) Swap(A[k],A[k+1]); } Tương tự hàm xếp xen vào ,ta đánh giá thời gian chạy hàm xếp bọt O(n2 ) Trong hàm BubbleSort thực lệnh lặp (1), đến số i đó, n-1 ≥ i > 1, mà đoạn đầu A[0 i] sắp, ta dừng Do ta cải tiến hàm BubbleSort cách đưa vào biến sorted, biến nhận giá trị true A[0 i] nhận giá trị false ngược lại Khi sorted nhận giá trị true lệnh lặp (1) dừng lại void BubbleSort (Item A[] , int n) { for (int i = n-1 ; i > ; i ) { bool sorted = true; for( int k = ; k < i ; k++) if (A[k].key > A[k+1].key) { swap (A[k], A[k+1]); sorted = false; } if (sorted) break; } } Sinh viên thực hiện:Nguyễn Hải Nam 34 http://kilobooks.com Nghiên cứu khoa học 3.2 THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp SẮP XẾP HỒ NHẬP KIL OBO OKS CO M Thuật tốn xếp hồ nhập (MergeSort) thuật tốn thết kế kỹ thuật chia - để - trị Giả sử ta cần xếp mảng A[a b], a, b số ngun khơng âm, a b, a số đầu b số cuối mảng Ta chia mảng thành hai mảng số c nằm a b ( c = ( a + b ) / 2) Các mảng A[a c] A[c+1…b] xếp cách gọi đệ quy thủ tục xếp hồ nhập Sau ta hồ nhập hai mảng A[a…c] A[c+1…b] thành mảng A[a…b] Giả sử Merge(A,a,c,b) hàm kết hợp hai mảng A[a c] A[c+ b] thành mảng A[a b] Thuật tốn xếp hồ nhập biểu diễn hàm đệ quy sau void MergeSort( Item A[ ], int a, int b) { if (a < b) { int c = (a + b)/2; MergeSort ( A, a, c ); MergeSort ( A, c+1, b); Merge ( A, a, c, b); } } Cơng việc lại ta thiết kế hàm hồ nhập Merge ( A, a, c, b), nhiệm vụ kết hợp hai nửa mảng A[a…c] A[ c+1…b] thành mảng Ý tưởng thuật tốn hồ nhập ta đọc thành phần hai nửa mảng chép vào mảng phụ B[0 b-a] theo thứ tự tăng dần Giả sử i số chạy mảng A[a…c], i khởi tạo a ; j số chạy mảng A[c+1 b], j khởi tạo c + So sánh A[i] A[j], A[i].key < A[j].key ta chép A[i] vào mảng B tăng i lên 1, ngược lại ta chép A[j] vào mảng B va tăng j lên Lặp lại hành động i vượt q c j vượt q b Nếu số i chưa vượt q c j vượt q b ta cần phải chép phần lại Sinh viên thực hiện:Nguyễn Hải Nam 35 http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp A[i…c] vào mảng B Tương tự, i > c, j ≤ b ta cần chép phần KIL OBO OKS CO M lại A[j…b] vào mảng B Chẳng hạn, xét mảng số ngun A[ 5…14], A[5…9] A[10…14] sau: i A 10 a=5 j 12 20 31 35 c= 10 11 15 12 26 21 13 14 Bắt đầu i = , j = 10 Vì A[5] > A[10] nên A[10] = chép vào mảng B j = 11 Ta lại có A[5] > A[11], nên A[11] = chép vào mảng B j = 12 Đến dây A[5] < A[12], ta chép A[5] = 10 vào mảng B i = Tiếp tục ta nhận mảng B sau: B 10 12 15 21 26 20 Đến j = 15 > b = 14, i = < c = 9, ta chép nốt A[8] = 31 A[9] = 35 sang B để nhận mảng B Bây cần chép lại mảng B sang mảng A Hàm Merge viết sau: void Merge( Item A[] , int a , int c , int b) // a, c, b số ngun khơng âm, a ≤ c ≤ b // Các mảng A[a…c] A[c+1…b] { Sinh viên thực hiện:Nguyễn Hải Nam 36 http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp KIL OBO OKS CO M int i = a; int j = c + 1; int k = 0; int n = b – a + 1; Item * B = new Item[n]; (1) while (( i < c +1 ) && ( j < b +1 )) if ( A [i].key < A[j].key) B[k ++] = A[i ++]; else B[k ++] = A[j ++]; (2) while ( i < c + 1) B[k ++] = A[i++]; (3) while ( j < b +1) B[k ++] = A[ j ++]; i = a; (4) for ( k = ; k < n ; k ++) A[i ++] = B [k]; delete [ ] B; } Phân tích xếp hồ nhập Giả sử mảng cần xếp A[a…b] có độ dài n, n = b – a +1, T(n) thời gian chạy hàm MergeSort (A, a, b) Khi thời gian thực lời gọi đệ quy MergeSort (A, a, c) MergeSort (A, c + 1, b) T(n/2) Chúng ta cần đánh gía thời gian chạy hàm Merge(A, a, c, b) Xem xét hàm Merge ta thấy rằng, lệnh lặp (1), (2), (3) cần thực tất n lần lặp, lần lặp cần thực số cố định phép tốn Do tổng thời gian ba lệnh lặp (1), (2), (3) O(n) Lệnh lặp (4) cần thời gian O(n) Khi thực hàm MergeSort(A, a, b) với a = b, phép so sánh phải thực hiện, T(1) = O(1) Từ hàm đệ quy MergeSort đánh giá trên, ta có quan hệ đệ quy sau T(1) = O(1) T(n) = 2T(n/2) + O(n) với n>1 Giả sử thời gian thực phép tốn lần lặp hàm Merge số d đó, ta có : Sinh viên thực hiện:Nguyễn Hải Nam 37 http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp T(1) ≤ d T(n) ≤ 2T(n/2) + nd KIL OBO OKS CO M Áp dụng phương pháp lặp vào bất đẳng thức ta nhận T(n) ≤ 2T(n/2) + n d ≤ 22 T(n/22) + (n/2)d + n d …… ≤ 2k T(n/2k) + n d + …+ n d (k lần nd) Giả sử k số ngun dương lớn cho ≤ n / 2k Khi đó, ta có T(n) ≤ 2k T(1) + n d + … + n d ( k lần n d) T(n) ≤ (k + 1) n d T(n) ≤ (1 + log n) n d Vậy T(n) = O (n log n) 3.3 SẮP XẾP NHANH Trong mục trình bày thuật tốn xếp đưa Hoare, tiếng với tên gọi xếp nhanh (QuickSort) Thời gian chạy thuật tốn trường hợp xấu O(n2) Tuy nhiên thời gian chạy trung bình O(n logn) Thuật tốn xếp nhanh thiết kế kỹ thuật chia-để-trị thuật tốn xếp hòa nhập Nhưng thuật tốn xếp hòa nhập, mảng A[a…b] cần chia đơn giản thành hai mảng A[a c] A[c+1 b] điểm chia mảng, c = (a+b)/2 Còn thuật tốn xếp nhanh, việc “chia mảng thành hai mảng con” q trình biến đổi phức tạp để từ mảng A[a b] ta thu hai mảng A[a k-1] A[k+1 b] thỏa mãn tính chất sau : A[i].key ≤ A[k].key với i, a ≤ i ≤ k-1 Sinh viên thực hiện:Nguyễn Hải Nam 38 http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp A[j].key > A[k].key với j, k+1 ≤ j ≤ b KIL OBO OKS CO M Nếu thực phân hoạch mảng A[a b] thành hai mảng A[a k-1] A[k+1 b] thỏa mãn tính chất trên, xếp mảng ta có tồn mảng A[a b] xếp Giả sử Partition(A, a, b, k) hàm phân hoạch mảng A[a b] thành hai mảng A[a k-1] A[k+1 b] Thuật tốn xếp nhanh thuật tốn đệ quy biểu diễn hàm đệ quy sau : void QuickSort(Item A[] , int a , int b) //Sắp xếp mảng A[a b] với a ≤ b { if (a < b) { int k; Partition(A, a, b, k); if (a right Lúc ta dễ thấy rằng, thành phần mảng A[a right] có khóa nhỏ hay mốc, thành phần mảng A[left b] có khóa lớn mốc Cuối ta trao đổi A[a] A[right] để đặt mốc vào vị trí k = right Hàm phân hoạch viết sau : void Partition( Item A[] , int a , int b , int & k) { keyType pivot = A[a].key; int left = a + 1; int right = b; { while (( left A[right] = 14 > nên right giảm dừng lại right = 4, A[4] < Ta có hồn cảnh sau : 14 12 17 13 15 right Sinh viên thực hiện:Nguyễn Hải Nam 41 left http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp KIL OBO OKS CO M Đến right < left, ta dừng lại, trao đổi A[0] với A[4] ta thu phân hoạch với k = right = 14 12 17 13 15 k Phân tích xếp nhanh Chúng ta cần đánh giá thời gian chạy T(n) thuật tốn xếp nhanh mảng A[a b] có n phần tử, n = b – a + Trước hết ta cần đánh giá thời gian thực hàm phân hoạch Thời gian phân hoạch thời gian qua mảng (hai biến left right chạy từ hai đầu mảng chúng gặp nhau), vị trí mà left right chạy qua ta cần so sánh thành phần vị trí với mốc trao đổi cần thiết Do phân hoạch mảng n phần tử ta cần thời gian O(n) Thời gian trường hợp tốt Trường hợp tốt xảy mà sau lần phân hoạch ta nhận hai mảng Trong trường hợp này, từ hàm đệ quy QuickSort, ta suy quan hệ đệ quy sau : T(1) = O(1) T(n) = T(n/2) + O(n) với n > Đây quan hệ đệ quy mà ta gặp phân tích xếp hòa nhập Như trường hợp tốt thời gian chạy QuickSort O(n logn) Thời gian trường hợp xấu Trường hợp xấu trường hợp mà sau lần phân hoạch mảng n phần tử ta nhận mảng n – phần tử phía mốc, phía khơng có phần tử (Dễ thấy trường hợp xẩy ta phân hoạch mảng sắp) Khi ta có quan hệ đệ quy sau : Sinh viên thực hiện:Nguyễn Hải Nam 42 http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp T(1) = O(1) Ta có : T(1) = C KIL OBO OKS CO M T(n) = T(n – 1) + O(n) với n > T(n) = T(n – 1) + nC với n > Trong C số Bằng cách lặp ta có : T(n) = T(1) + 2C + 3C + … + nC = C n ∑ i = Cn(n+1)/2 i =1 Do trường hợp xấu nhất, thời gian chạy xếp nhanh O(n2) Thời gian trung bình Bây ta đánh giá thời gian trung bình Ttb(n) mà QuickSort đòi hòi để xếp mảng có n phần tử Giả sử mảng A[a b] chứa n phần tử đưa vào mảng cách ngẫu nhiên Khi hàm phân hoạch Partition(A, a, b, k) cho hai mảng A[a k – 1] A[k + b] với k số từ a đến b với xác suất 1/n Vì thời gian thực hàm phân hoạch O(n), từ hàm QuickSort ta suy quan hệ đệ quy sau : n Ttb(n) = n Ttb(n) = n Hay ∑ k =1 [ Ttb(k - 1) + Ttb(n - k)] + O(n) n ∑ k =1 [ Ttb(k - 1) + Ttb(n - k)] + nC Trong C số Chú ý Sinh viên thực hiện:Nguyễn Hải Nam 43 (1) http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học Mơ thuật tốn xếp n ∑ k =1 n Ttb(k - 1) = ∑ k =1 Ttb(n - k) KIL OBO OKS CO M Do viết lại (1) sau : n Ttb(n) = ∑ n Ttb(k - 1) + nC k =1 (2) Trong (2) thay n bới n – ta có : n −1 Ttb(n - 1) = n−1 ∑ Ttb(k - 1) + (n – 1)C k =1 (3) Nhân (2) với n, nhân (3) với n – trừ cho ta nhận n Ttb(n) = (n + 1) Ttb(n - 1) + (2n – 1)C Chia đẳng thức cho n(n + 1) ta nhận quan hệ đệ quy sau : Ttb (n) n+1 = Ttb (n - 1) n + 2n - n ( n+1) C (4) Sử dụng phép lặp, từ (4) ta có Ttb (n) n +1 = Ttb (n - 1) n = Ttb (n - 2) n−1 2n - n ( n+1) C + + 2n - ( n −1) n 2n - + n ( n+1) C Ttb (n) n +1 = Ttb (1) + c n 2i − ∑ i (i + 1) i =1 Ta có đánh giá Sinh viên thực hiện:Nguyễn Hải Nam 44 (5) http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Nghiên cứu khoa học 2i − ≤ ∑ k =1 i (i + 1) n Mơ thuật tốn xếp n dx ≤ 2∫ ≤ 2logn ∑ x i =1 i n Ttb (n) n +1 hay KIL OBO OKS CO M Do từ (5) ta suy = O(logn) Ttb(n) = O(n logn) Trong trường hợp xấu nhất, QuickSort đòi hỏi thời gian O(n2), trường hợp xảy Thời gian trung bình QuickSort O(n logn), thời gian trường hợp xấu MergeSort O(n logn) Tuy nhiên thực tiễn cho thấy rằng, phần lớn trường hợp QuickSort chạy nhanh thuật tốn xếp khác 3.4 SẮP XẾP SỬ DỤNG CÂY THỨ TỰ BỘ PHẬN Trong mục trình bày phương pháp xếp sử dụng thứ tự phận (heapsort) Trong mục 10.3, biết thứ tự phận n đỉnh biểu diễn mảng A[0 n-1], gốc lưu A[0], đỉnh lưu A[i], đỉnh trái (nếu có) lưu A[2*i + 1], đỉnh phải có lưu A[2*i + 2] Mảng A thoả mãn tính chất sau (ta gọi tính chất heap): A[i].key = A[n-1].key Trong q trình trên, sau lần trao đổi A[0] với A[m] (với m=n1,…,1), ta nhận mảng A[0…m-1] thoả mãn tính chất heap với i >= 1, trừ i = Điều có nghĩa nhị phân biểu diễn mảng A[0 m-1] thoả mãn tính chất thứ tự phận, trừ gốc Để trở thành thứ tự phận, ta cần đẩy liệu lưu gốc xuống vị trí thích hợp cây, cách sử dụng hàm ShiftDown (Xem mục 10.3.3) Còn vấn đề cần giải quyết, biến đổi mảng cần xếp A[0 n-1] thành mảng thoả mãn tính chất heap Điều có nghĩa ta phải biến đổi nhị phân biểu diễn mảng A[0 n-1] thành thứ tự phận Muốn vậy, với i chạy từ n/2-1 giảm xuống 0, ta cần sử dụng hàm SiftDown để đẩy liệu lưu đỉnh i xuống vị trí thíc hợp Đây cách xây dựng thứ tự phận mà trình bày 10.3.2 Bây ta viết lại hàm ShiftDown cho thích hợp với sử dụng thuật tốn Giả sử mảng A[a b] (a < b) thoả mãn tính chất heap với i >= a+1 Hàm ShiftDown(a,b) sau thực việc đẩy A[a] xuống vị trí thích hợp mảng A[a b] để mảng thoả mãn tính chất heap với i >= a void ShiftDown(int a, int b) { int i = a; int j = * i + 1; while (j { for (int i = n / – ; i >= ; i ) ShiftDown(i,n-1); //Biến đổi mảng A[0 n-1] // thành mảng thoả mãn tính chất heap for (int i = n – ; i >= ; i ) { swap(A[0],A[i]); ShiftDown(0,i - 1); } } Phân tích HeapSort Thời gian thực lệnh lặp (1) thời gian xây dựng thứ tự phận mà xét mục 10.3.2 Theo chứng minh đưa 10.3.2, lệnh lặp (1) đòi hỏi thời gian O(n) Trong lệnh lặp (2), số lần lặp n-1 Thân vòng lặp (2), với i = n-1 swap(A[0],A[n - 1]); ShiftDown(0,n - 2); Đây lệnh thực DeleteMin thứ tự phận biểu diễn mảng A[0 n-1], liêụ có khố nhỏ lưu vào A[n-1] Trong Sinh viên thực hiện:Nguyễn Hải Nam 47 http://kilobooks.com Nghiên cứu khoa học THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Mơ thuật tốn xếp KIL OBO OKS CO M mục 10.3.1, ta chứng tỏ DeleteMin cần thời gian O(logn) Như thân lệnh lặp (2) cần thời gian nhiều O(logn) Do lệnh (2) cần thời gian O(nlogn) Vì vậy, thời gian thực HeapSort O(nlogn) Sinh viên thực hiện:Nguyễn Hải Nam 48 [...]... nếu danh sách đã được sắp xếp theo thứ tự tăng dần (hoặc giảm dần), ta có thể sử dụng kỹ thuật tìm kiếm nhị phân hiệu quả hơn nhiều tìm kiếm tuần tự… Trong thiết kế thuật tốn, ta cũng thường xun cần đến sắp xếp, nhiều thuật tốn được thiết kế dựa trên ý tưởng xử lý các đối tượng theo một thứ tự xác định Các thuật tốn sắp xếp được chia làm 2 loại: sắp xếp trong và sắp xếp ngồi Sắp xếp trong được thực hiện... đối tượng cần sắp xếp được lưu ở bộ nhớ trong của máy tính dưới dạng mảng Do đó sắp xếp trong còn được gọi là sắp xếp mảng Khi các đối tượng cần sắp xếp q lớn cần lưu ở bộ nhớ ngồi dưới dạng file, ta cần sử dụng các phương pháp sắp xếp ngồi, hay còn gọi là sắp xếp file Trong chương này, chúng ta trình bày các thuật tốn sắp xếp đơn giản, các thuật tốn này dòi hỏi thời gian O(n2) để sắp xếp mảng n đối... Vấn đề sắp xếp bây giờ được phát biểu chính xác như sau Cho mảng A[0 n-1] chứa n Item, chúng ta cần sắp xếp lại các thành phần của mảng A sao cho: A[0].key ... chương trình song song Nó hệ thống mơ thuật tốn hướng đối tượng 2-D mở rộng thành hệ thống 3-D, POLKA 3-D POLKA 3-D cung cấp nhìn 3-D 3-D ngun thủy, ví dụ như: hình nón, hình cầu, hình lập phương... chạy lệnh lặp (3) Số lần lặp (n-1-i), thời gian thực lệnh (4) O(1), thời gian chạy lệnh (3) (n-1-i)O(1) Như vậy, thân lệnh lặp (1) có thời gian chạy lần lặp thứ i (n-1-i)O(1) Do lệnh lặp (1) đòi... (2), số lần lặp n-1 Thân vòng lặp (2), với i = n-1 swap(A[0],A[n - 1]); ShiftDown(0,n - 2); Đây lệnh thực DeleteMin thứ tự phận biểu diễn mảng A[0 n-1], liêụ có khố nhỏ lưu vào A[n-1] Trong Sinh

Ngày đăng: 02/12/2015, 12:27

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan