Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 114 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
114
Dung lượng
331,5 KB
Nội dung
254 ChươngSắpsếp - SORTING Vấn đề xếp có vai trò quan trọng tốn thực tế Chẳng hạn để xử lý tệp hoá đơn toán ngân hàng người ta xếp tệp hố đơn theo thứ tự tăng dần số hiệu hoá đơn Trong biểu tổng hợp kết kinh doanh cần xếp cột tiền bán hàng theo chiều tăng dần hay giảm dần Việc xếp theo trường (gọi trường khố) tạo điều kiện thuận lợi cho việc tìm kiếm thơng tin Yêu cầu tìm kiếm xuất thường xuyên tốn thực tế, chẳng hạn tìm kiếm hoá đơn cho số hiệu hoá đơn ấy.v.v Một giải thuật thứ tự gọi tốt giải thuật đòi hỏi vùng nhớ nhỏ thời gian thực nhanh Tuy nhiên, việc đánh giá giải thuật phụ thuộc vào thứ tự xuất phần tử dãy ban đầu; 254 255 dãy ban đầu có thứ tự hay chưa có thứ tự theo vùng khố Để tốn vùng nhớ giải thuật phải sử dụng hữu hiệu vùng nhớ phần tử hạn chế việc sử dụng vùng nhở tạm thời Để đánh giá thời gian thực giải pháp thứ tự, ta phải dựa vào hai đại lượng đặc trưng số lần so sánh (C) số lần đổi chỗ hai phần tử (M) Hai đại lượng C M phụ thuộc vào tính chất thống kê dãy phần tử phụ thuộc vào số phần tử cần thứ tự (n) Các giải thuật thứ tự chia thành ba nhóm chính: - Sắp thứ tự phương pháp xen vào ( Insertion) - Sắp thứ tự phương pháp chọn lựa (Selection) - Sắp thứ tự phương pháp đổi chỗ ( Exchange) 255 256 Trong chương này, đề cập đến số giải thuật xếp 7.1 Một số khái niệm xếp theo khoá Giả sử ta xét vấn đề xử lý tệp hoá đơn ngân hàng, hoá đơn gồm trường sau đây: Số hiệu hoá đơn Tên người gửi tiền Số lượng tiền gửi Ngày gửi Như vấn đề xếp tệp hoá đơn theo trường khoá số hiệu hố đơn phát biểu tổng qt toán xếp với bảng gồm n ghi R1, R2, Rn Mỗi hố đơn có cấu trúc sau: SHHD tên Họ Tiền gửi Ngày gửi 256 257 Key Trong trình xếp ghi tệp hố đơn bổ trí lại vị trí cho giá trị khố trường tương ứng với chúng có thứ tự ấn định Ta thấy kích thước khố thường nhỏ so với kích thước ghi (Chẳng hạn trường hợp khoá số hiệu hoá đơn chiếm 1/5 ghi) Nếu việc xếp thực tất ghi tệp dẫn đến việc chuyển đổi vị trí tất ghi, tức phải chép toàn ghi vào vùng nhớ mới, làm tốn nhiều không gian nhớ Để khắc phục điều người ta xây dựng bảng phụ gồm n ghi bảng ghi bao gồm hai trường khố trỏ Trường khoá chứa giá trị khoá ứng với ghi bảng chính, trường trỏ, trỏ tới ghi tương ứng Bảng phụ gọi bảng khoá ( Key table) việc xếp thực trực tiếp bảng khoá Như 257 258 q trình xếp bảng khơng bị ảnh hưởng gì, việc truy nhập vào ghi bảng thực cách dựa vào trỏ ghi tương ứng thuộc bảng khoá này.Sơ đồ sau cho thấy mối liên hệ bảng khố bảng chính: Bảng khố 75 * Bảng 75 Tên Số lượng 42 * 42 Tên Số lượng 38 * 38 Tên Số lượng 80 * 80 Tên Số lượng Key Ke y 258 259 Sau xếp theo chiều tăng dần trường khoá ta có: 38 * 75 Tê n Số lượng 42 * 42 Tê n Số lượng 75 * 38 Tê n Số lượng 80 * 80 Tê n Số lượng Key Ke y Như vậy, rõ ràng khố có vai trò đặc biệt quan trọng so với trường khác, đại diện cho ghi Do trình bày giải thuật với ghi nói tới giá trị khố Bài tốn xếp 259 260 ghi R1, R2 Rn thực chất toán xếp với dãy khoá K1,,K2 Kn Trong thuật toán đây, giả sử trường khoá chứa giá trị số trình tự xếp tăng dần [1,2] 7.2 xếp kiểu lựa chọn (Selection Sort) Tư tưởng chủ đạo giải thuật xếp kiểu lựa chọn lượt thứ I ta chọn dãy khoá Ki, Ki+1, Kn khoá nhỏ đổi chỗ với Kj Như sau J lượt, J khoá nhỏ vị trí thứ nhất, thứ hai thứ J theo thứ tự xếp[1] Chúng ta minh hoạ giải thuật ví dụ sau đây: Giả sử số hiệu hoá đơn đánh số là: 42 23 58 94 74 36 11 55 99 87 260 261 bước thứ ta thấy 11 số hiệu hoá đơn nhỏ nhất, ta đổi chỗ cho 74, 23 42 Bây số hiệu hoá đơn 11 đứng đầu dãy khố Trong khố lại, số hiệu hố đơn 23 nhỏ bước khoá lại (42,74,55,58,94,36,99,87) khố nhỏ 36 Và trình tự tiếp diễn kết thúc dãy khoá Giải thuật sau: Procedure Select _ Sort(k: Vector; var n : integer); Var x: real; i,j , m: integer; Begin For I : = to n-1 Begin m : =I; For J : = i+1 to n 261 262 = j; If k[j] = n if not up then - {chép dãy có thứ tự vùng vào vùng} for i: = to n a[j]: = a[i + n] end Phân tích phương pháp trộn thẳng Ta nhận thấy bước thực với chiều dài run 2*p trình thứ tự kết thúc chiều dài lớn n Do đó, q trình thức gồm log2(n) bước bước có n lần chép, nên số lần chuyển đổi là: M = n*log2(n) Số lần so sánh C nhỏ M phần run lại sau bước cần chép mà không cần so sánh Tuy nhiên phương pháp trộn thường áp dụng cho việc thứ tự nhớ mà thời gian để chép liệu nhiều so với thời gian 353 354 phép so sánh Do đó, việc phânt ích chi tiết phép so sánh khơng có ý nghĩa Phương pháp trộn rõ ràng phương pháp tốt phương pháp cải tiến trình bày Nhưng nhược điểm phương pháp tốn gấp đôi vùng nhớ (2*n) nên phương pháp dùng cho việc thứ tự dãy mà thường dùng cho việc thứ tự tập tin 7.8.2 Phương pháp trộn tự nhiên Trong phương pháp trên, ta nhận thấy giải thuật khơng tận dụng run có chiều dài cực đại, số bước giải thuật xác định trước Nội dung phương pháp trộn tự nhiên trộn run có chiều dài cực đại (hai run cần trộn có chiều dài khơng nhau) dãy a[1] a[2] a[n] dãy gồm run 354 355 Ta sử dụng 2*n vùng nhỏ để trộn run từ vùng phân phối vào vùng Vùng gồm phần tử a[1] a[n] vùng gồm phần tử a[n + 1] a[2*n] Khi trộn phân phối, ta trộn run ngược chiều vùng trộn phân phối luân phiên vào hai đầu vùng phân phối để bước để trộn Nếu vùng phân phối gồm run q trình trơn phân phối run kết thức Khi kết thúc, vùng phân phối gồm phần tử a[n+1] a[2*n] vào dãy a[1] a[n] Ví dụ: Ta cần thứ tự dãy 44 55 12 42 94 18 06 67 Bước 1: Vùng vùng trộn, vùng vùng phân phối Vùng 1: 44 45 12 42 94 18 06 67 Vùng 2: 44 55 67 94 42 18 12 06 Ta có run (44 55) trộn với run (67) đưa vào vùng theo chiều tăng số, run (12 42) 355 356 trộn với run (06 18 94) đưa vào vùng theo chiều giảm số Bước 2: Vùng vùng trộn, vùng vùng phân phối Vùng 2: 44 55 67 94 42 18 12 06 Vùng 1: 06 12 18 42 44 55 67 94 Ta có run (44 55 67) trộn với run (06 12 18 42 94) đưa vào vùng theo chiều tăng số Ta khai báo: Var a: array [1 2*n] of item; Gọi: up - kiểu boolean up = truc: vùng vùng trộn, vùng vùng phân phối up = false: vùng phân phối, vùng vùng trộn d- cho biết chiều phân phối d = 1: chiều phân phối run tăng dần d= -1: chiều phân phối run giảm dần r - cho biết run vùng phân phối 356 357 Giải thuật sau : Procedure Natural_ Two _ Way _ Merge_ Sort; Var up: boolean; i, j, k, q, t: index; d,r: integer; begin up: = true; repeat if up then begin { vùng vùng trộn, vùng vùng phân phối} i: = 1; j : = n k: = n + 1; q: = 2*n end else begin {vùng vùng phân phối, vùng vùng trộn} 357 358 i: = n +1; j: = 2*n; k: = 1; q: = n end; d: = 1; r: = 0; while i j if a[i].key > a[j].key then begin { chép run j vào run k} a[k]: = a[j]; k: = k +d j: = j - 1; if a[j+1].key > a[j].key then begin {hết run j} {chép phần lại run i vào run k} repeat a[k]: = a[i]; k: = k +d; i: = i +1 until a[i-1].key > a[i].key; { đếm số run phân phối lê n 1} r: = r+1; {đổi chiều vùng phân phối } 358 359 t: = q; q: = k; k: = t; d: = - d end end else begin a[k]: = a[i]; k: = k + d; i: = i +1; if a[i-1].key then begin {hết run i} Chép phần lại run j vào run k} repeat a[k]: = a[j]; k: = k + d; j : = j -1 until a[j].key < a[j +1].key; {đếm số run phân phối lên 1} r: = r+1; {đổi chiều vùng phân phối} r: = r +1; d: = - d end; 359 360 end { chép phần tử lại cuối vào run k} a[k]: = a[i]; r: = r + 1; {đổi vùng trộn vùng phân phối} up: = not up until r = 1; if not up then { chép dãy ó thứ tự vùng vào vùng 1} for i : = to n do a[i]: = a[n+i] end; So sánh phương pháp xếp Trên xem xét giải thuật xếp khác Bây so sánh phương pháp xếp Gọi: n - số phần tử cần thứ tự C - số lần so sánh M - số lần di chuyển Trước tiên ta nêu bảng đánh giá cho phương pháp trực tiếp: 360 361 Phương pháp Xen vào C= trực tiếp M= Chọn lựa C= trực tiếp M= Đổi chỗ C = trực tiếp M= Min Trung bình Max n -1 (n2 + n -2)/4 (n2 - 9n -10)/4 n(n-1)/2 2(n-1) n(n1)/2 3(n-1) n 1)/2 n(n-1)/2-1 (n2 + 3n )/2 n(n-1)/2 n(ln(n) + n2 /4+ 3(n 0.57) -1) (n- n(n-1)/2 n(n-1)/2 0.75n(n-1) 1.5n(n-1) Đối với phương pháp thứ cải tiến khác cơng thức đánh giá phức tạp nói chung độ phức tạp nói chung độ phức tạp tính tốn cần thiết C i * n1.2 cho 361 362 shell sort Ci * n* log (n) cho Heap sort Quick sort Dựa vào cơng thức đánh giá, ta phân chia phương pháp thành phương pháp đơn giản trực tiếp (tỉ lệ với n 2) phương pháp cải tiến logarithm ( tỉ lệ với n * log2(n) ) Tuy nhiên để đánh giá phương pháp cách xác cần phải có số liệu thực nghiệm hệ số Ci Ngoài ta đánh giá số lần so sánh số lần đổi chỗ mà chưa đề cập đến độ phức tạp chương trình, chẳng hạn kiểm tra vòng lặp, mà thơngn số tuỳ thuộc vào hệ thống riêng biệt Bảng cho ta thời gian ( tính miliseccond) cần thiết để thực phương pháp thứ tự trình bày, chương trình viết ngôn ngữ Pascal thực máy CDC - 6400 Bảng trình bày thành ba cột tương ứng với ba trường hợp dãy: dãy có thứ tự, dãy ngẫu nhiên, dãy có thứ tự ngược Trong cột gồm có hai cột tương ứng với n = 256 n = 512 phần tử 362 363 Phương pháp Xen vào trực tiếp Xen vào nhị phân Chọn lựa trực tiếp Bubble sort Bubble sort có cờ Shaker sort Shell sort Heap sort Quick sort Có thứ tự Ngẫu nhiên 12 23 366 144 56 125 373 132 48 1907 509 195 54 2165 102 405 110 427 961 364 58 116 127 349 11 253 110 241 31 69 60 146 Thứ tự ngược 704 2836 662 2490 695 2675 149 164 161 157 104 5931 37 79 6542 6520 492 226 363 364 Merge sort 99 234 102 242 99 232 Các số liệu bảng cho ta thấy phân biệt rõ ràng phương pháp tỷ lệ với n phương pháp tỷ lệ n*log2(n) Từ bảng ta có nhận xét sau: 1- Cải tiến phương pháp xen vào nhị phân so với phương pháp xen vào trực tiếp rõ ràng khơng có ý nghĩa trường hợp dãy có thứ tự ngựơc cải tiến xấu - Phương pháp Bubble sort phương pháp chậm tất phương pháp so sánh Ngay phương pháp Shaker sort ( phương pháp cải tiến Bubble sort) chậm phưoưng pháp xen vào trực tiếp ( ngoạit rừ trường hợp dãy có thứ tự 3- Quick sort nhanh Heap sort gấp hai đến ba lần Quick sort thứ tự dãy có thứ tự ngược nhanh trường hợp dãy có thứ tự 364 365 Số liệu cho bảng xét đến giá trị khoá mà chưa xét đến liệu phụ kèm theo khố Đây trường thợp khơng thực tế Bảng cho ta kết so sánh phươnng pháp trường hợp n = 256 mẫu tin, mà mẫu tin có chứa vùng liệu phụ lớn gấp bảy lần vùng khóa Giá trị cho bên trái ứng với mẫu tin khơng có liệu phụ giá trị cho bên phải ứng với mẫu tin có chứa liệu phụ Phương pháp Xen vào trực tiếp Xen vào nhị phân Chọn lựa trực tiếp Có thứ Ngẫu nhiên Thứ tự tự ngược 12 46 366 1129 704 2150 56 76 373 48 547 509 1105 662 2070 607 1430 695 365 366 Bubble sort Bubble sort có cờ Shaker sort Shell sort Heap sort Quick sort Merge sort 54 610 1026 3212 1492 5599 5 1104 3237 1645 5762 5 961 3071 1619 5757 58 186 127 373 157 435 11 264 110 31 55 60 246 104 227 137 37 75 99 196 102 195 99 187 Từ bảng ta có nhận xét sau: 1- Phương pháp chọn trực tiếp nhanh đáng kể trở thành phương pháp trực tiếp tốt 2- Bubble sort phương pháp chậm nhất, có Shaker sort nhanh trường hợp dãy có thứ tự ngược 366 367 - Quick sort phương pháp nhanh phương pháp tốt thứ tự dãy 367 ... thành ba nhóm chính: - Sắp thứ tự phương pháp xen vào ( Insertion) - Sắp thứ tự phương pháp chọn lựa (Selection) - Sắp thứ tự phương pháp đổi chỗ ( Exchange) 255 256 Trong chương này, đề cập đến... i=4 12 44 55: 42 94 18 06 67 i=5 12 42 44 55: 94 18 06 67 i=6 12 42 44 55 94: 18 06 67 i =7 12 18 42 44 55 94: 06 67 i=8 06 12 18 42 44 55 94: 67 06 12 18 42 44 55 67 94 Trong giải thuật sau đây,... quảlà dãy 277 278 a[1] a[i] có thứ tự Ta áp dụng cách làm với i = 2,3, ,n Ví dụ : Ta cần thứ tự dãy 44 55 12 42 94 18 06 67 i=2 44: 55 12 42 94 18 06 67 i=3 44 55 : 12 42 94 18 06 67 i=4 12 44