Giáo trình giải thuật của Nguyễn Văn Linh part 7
Thông tin tài liệu:
Nội dung trích xuất từ tài liệu:
Giáo trình giải thuật của Nguyễn Văn Linh part 7Giải thuật Sắp xếp2.6 BINSORT2.6.1 Giải thuậtNói chung các giải thuật đã trình bày ở trên đều có độ phức tạp là O(n2) hoặcO(nlogn). Tuy nhiên khi kiểu dữ liệu của trường khoá là một kiểu đặc biệt, việc sắpxếp có thể chỉ chiếm O(n) thời gian. Sau đây ta sẽ xét một số trường hợp.2.6.1.1 Trường hợp đơn giản:Giả sử ta phải sắp xếp một mảng A gồm n phần tử có khoá là các số nguyên có giátrị khác nhau và là các giá trị từ 1 đến n. Ta sử dụng B là một mảng cùng kiểu với Avà phân phối vào phần tử b[j] một phần tử a[i] mà a[i].key = j. Khi đó mảng B lưutrữ kết quả đã được sắp xếp của mảng A.Ví dụ 2-7: Sắp xếp mảng A gồm 10 phần tử có khoá là các số nguyên có giá trị làcác số 4, 7, 1, 2, 5, 8, 10, 9, 6 và 3Ta sử dụng mảng B có cùng kiểu với A và thực hiện việc phân phối a[1] vào b[4] vìa[1].key = 4, a[2] vào b[7] vì a[2].key = 7, a[3] vào b[1] vì a[3].key = 1,...Hình sau minh họa cho việc phân phối các phần tử của mảng a vào mảng b.Nguyễn Văn Linh Trang 39 Sưu t m b i: www.daihoc.com.vnGiải thuật Sắp xếp Mảng a a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Khóa 4 7 1 2 5 8 10 9 6 3 Khóa 1 2 3 4 5 6 7 8 9 10 Mảng b b[1] B[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9] b[10] Hình 2-18: Phân phối các phân tử a[i] vào các bin b[j]Ðể thực hiện việc phân phối này ta chỉ cần một lệnh lặp: for i:=1 to n do b[a[i].key] := a[i]Ðây cũng là lệnh chính trong chương trình sắp xếp. Lệnh này lấy O(n) thời gian.Các phần tử b[j] được gọi là các bin và phương pháp sắp xếp này được gọi là binsort.2.6.1.2 Trường hợp tổng quátLà trường hợp có thể có nhiều phần tử có chung một giá trị khóa, chẳng hạn để sắpmột mảng A có n phần tử mà các giá trị khóa của chúng là các số nguyên lấy giá trịtrong khoảng 1..m với m Giải thuật Sắp xếpnó. Ðể cho có hiệu quả, ta thêm một con trỏ nữa, trỏ đến phần tử cuối cùng của mỗidanh sách, điều này giúp ta đi thẳng tới phần tử cuối cùng mà không phải duyệt quatoàn bộ danh sách. Hình sau minh họa việc nối hai danh sách. L1 Header L1 End L2 Header L2 End NIL Hình 2-19: Nối các binSau khi nối thì header và end của danh sách L2 không còn tác dụng nữa.Ví dụ 2-8: Sắp xếp mảng A gồm 10 phần tử có khoá là các số nguyên có giá trị làcác số 2, 4, 1, 5, 4, 2, 1, 4, 1, 5. A a[1] a[2] A[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Khoá của A 2 4 1 5 4 2 1 4 1 5Ta thấy các giá trị khoá nằm trong khoảng 1..5. Ta tổ chức một mảng B gồm 5 phầntử, mỗi phần tử là một con trỏ, trỏ đến một danh sách liên kết. a[3] a[7] a[9] 1 a[1] a[6] 23 a[2] a[5] a[8]45 a[4] a[10] Hình 2-20: Binsort trong trường hợp tổng quátNguyễn Văn Linh Trang 41 Sưu t m b i: www.daihoc.com.vnGiải thuật Sắp xếpChương trình sử dụng cấu trúc danh sách liên kết làm các binVARa: ARRAY[1..n] OF RecordType;b: ARRAY[keytype] OF ListType;{Ta giả thiết keytype là kiểu miền con 1..m }PROCEDURE BinSort;VAR i:integer; j: KeyType;BEGIN{1}FOR i:=1 TO n DO Insert(A[i], END(B[A[i].key]), B[A[i}.key]);{2}FOR j:= 2 TO m DO Concatenate(B[1], B[j]);END;2.6.2 Phân tích Bin SortBin sort lấy O(n) thời gian để sắp xếp mảng gồm n phần tử.Trước hết thủ tục INSERT cần một thời gian O(1) để xen một phần tử vào trongdanh sách. Do cách tổ chức danh sách có giữ con trỏ đến phần tử cuối cùng nên việcnối hai danh sách bằng thủ tục CONCATENATE cũng chỉ mất O(1) thời gian. Tathấy vòng lặp {1} thực hiện n lần, mỗi lần tốn O(1) = 1 nên lấy O(n) đơn vị thờigian. Vòng lặp {2} thực hiện m-1 lần, mỗi lần O(1) nên tốn O(m) đơn vị thời gian.Hai lệnh {1} và {2} nối tiếp nhau nên thời gian thực hiện của BinSort là T(n) =O(max(n,m)) = O(n) vì m ≤ n.2.6.3 Sắp xếp tập giá trị có khoá lớnNếu m số các khoá không lớn hơn n số các phần tử cần sắp xếp, khi đóO(max(n,m)) thực sự là O(n). Nếu n > m thì T(n) là O(m) và đặc biệt khi m = n2 thìT(n) là O(n2), như vậy Bin sort không tốt hơn các sắp xếp đ ...
Tìm kiếm theo từ khóa liên quan:
Kỹ thuật lập trình giải thuật hướng dẫn giải thuật cấu trúc dữ liệu lập trìnhGợi ý tài liệu liên quan:
-
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 318 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 266 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 208 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 195 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 168 0 0 -
Giải thuật và cấu trúc dữ liệu
305 trang 163 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 153 0 0 -
Bài giảng Phân tích thiết kế phần mềm: Chương 1 - Trường ĐH Ngoại ngữ - Tin học TP.HCM
64 trang 150 0 0 -
Tập bài giảng Thực hành kỹ thuật lập trình
303 trang 143 0 0 -
Giáo trình Cấu trúc dữ liệu và thuật toán (Tái bản): Phần 1
152 trang 139 0 0 -
Tài liệu tham khảo: Cấu trúc dữ liệu và giải thuật
229 trang 124 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 118 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 114 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 109 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 106 0 0 -
Giáo trình Lập trình Web với Servlet và JSP: Phần 1
56 trang 96 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 2
184 trang 93 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 1
246 trang 85 0 0 -
Giáo trình toán rời rạc - Phụ lục 2
15 trang 85 0 0 -
Nghiên cứu triển khai nội địa hóa máy tính thương hiệu Việt Nam
585 trang 83 0 0