Khái niệm sắp xếp dường như đã gắn liền với xã hội loài người từ thuở ban đầu của nền văn minh. Nó đơn giản thể hiện trong việc sắp hàng, trong việc phân công công việc, … Ngày nay, trong một thế giới mà khoa học công nghệ mỗi ngày phát triển như vũ bão và nhu cầu khai thác, tìm kiếm thông tin của con người ngày càng cao thì việc nâng cao tính hiệu quả của các giải thuật sắp xếp cũng ngày càng trở nên quan trọng. Trong hầu hết các hệ lưu trữ, quản lý dữ liệu thao tác tìm kiếm là thao tác cơ bản để khai thác thông tin. Để việc tìm kiếm trở nên hiệu quả và nhanh chóng thì dữ liệu trong hệ thống cần được tổ chức theo một trật tự nào đó và điều này đòi hỏi chúng ta phải xây dựng những giải thuật sắp xếp thích hợp.Bài báo cáo này nhằm mục đích giới thiệu về Sorting Searching. Hy vọng nhận được những nhận xét và đánh giá chân thành từ thầy và các bạn.
TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN Môn: Phân tích thiết kế & giải thuật Đề tài: Sorting and Searching GVHD : ThS. Võ Đức Vĩnh SVTH : Nguyễn Văn Thanh Lớp : 12050301 MSSV : 51203124 TP.Hồ Chí Minh, Ngày 01 Tháng 04 Năm 2015 LỜI NÓI ĐẦU Khái niệm xếp dường gắn liền với xã hội loài người từ thuở ban đầu văn minh. Nó đơn giản thể việc hàng, việc phân công công việc, … Ngày nay, giới mà khoa học công nghệ ngày phát triển vũ bão nhu cầu khai thác, tìm kiếm thông tin người ngày cao việc nâng cao tính hiệu giải thuật xếp ngày trở nên quan trọng. Trong hầu hết hệ lưu trữ, quản lý liệu thao tác tìm kiếm thao tác để khai thác thông tin. Để việc tìm kiếm trở nên hiệu nhanh chóng liệu hệ thống cần tổ chức theo trật tự điều đòi hỏi phải xây dựng giải thuật xếp thích hợp. Bài báo cáo nhằm mục đích giới thiệu Sorting & Searching. Hy vọng nhận nhận xét đánh giá chân thành từ thầy bạn. Trang ĐỒ ÁN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG Tôi xin cam đoan sản phẩm đồ án riêng hướng dẫn ThS. Võ Đức Vĩnh. Các nội dung nghiên cứu, kết đề tài trung thực chưa công bố hình thức trước đây. Những số liệu bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá tác giả thu thập từ nguồn khác có ghi rõ phần tài liệu tham khảo. Ngoài ra, đồ án sử dụng số nhận xét, đánh số liệu tác giả khác, quan tổ chức khác có trích dẫn thích nguồn gốc. Nếu phát có gian lận xin hoàn toàn chịu trách nhiệm nội dung đồ án mình. Trường đại học Tôn Đức Thắng không liên quan đến vi phạm tác quyền, quyền gây trình thực (nếu có). TP. Hồ Chí Minh, ngày 01 tháng 04 năm 2015 Tác giả Nguyễn Văn Thanh Trang PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN Phần xác nhận GV hướng dẫn __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ ___________________________________________________ Tp. Hồ Chí Minh, ngày tháng năm (kí ghi họ tên) Phần đánh giá GV chấm __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ ___________________________________________________ Tp. Hồ Chí Minh, ngày tháng năm (kí ghi họ tên) Trang Mục Lục LỜI NÓI ĐẦU PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN . Phần I: Sorting . I. Lý thuyết – Thuật toán: . 1. Selection sort: . 2. Insertion sort: 3. Bubble sort: . 4. Merge sort: . 10 5. Quick sort : 12 6. Heap sort : . 17 7. Radix sort: . 19 II. Môi trường thực nghiệm: . 23 1. Cấu hình máy thực nghiệm: 23 2. Cấu trúc liệu thực nghiệm: Mảng (Array[]) . 23 3. Kiểu liệu thực nghiệm: Integer. . 23 4. Hàm tính thời gian c#: . 25 III. Thực nghiệm: 25 1. Insertion sort: 25 2. Selection sort: . 27 3. Bubble sort: . 29 4. Merge sort: . 30 5. Quick sort: . 32 6. Heap sort: 36 7. Radix sort: . 37 IV. Nhận xét kết Lý thuyết – Thực nghiệm: . 39 Phần 2: Searching 41 I. Cở sở lý thuyết Brute – Force: . 41 II. Thuật toán tìm kiếm Chia để trị: . 42 III. Thực nghiệm: 43 Trang Phần I: Sorting I. Lý thuyết – Thuật toán: 1. Selection sort: - Ý tưởng: Chọn phần tử nhỏ n phần tử ban đầu, đưa phần tử vị trí dãy hành. Sau không quan tâm đến nữa, xem dãy hành n-1 phần tử dãy ban đầu, vị trí thứ 2. Lặp lại trình cho dãy hành đến dãy hành phần tử. Dãy ban đầu có n phần tử, tóm tắt ý tưởng thuật toán thực n-1 lượt việc đưa phần tử nhỏ dãy hành vị trí đầu dãy. - Các bước thực hiện: Giả sử ta có mảng a[0 .n-1]. Bước 1: Cho i số đếm 0, i=0. Bước 2: Tìm phần tử a[min] nhỏ dãy hành từ a[i] đến a[n-1] Bước 3: Hoán vị a[min] a[i] Bước 4: Nếu i 17000000µs. - Worst case: + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Theo tính toán thời gian thực tế giải thuật 161980827µs. 4. Merge sort: - Best case: + Ta có 100000 số kiểu integer -> 999999 xếp (Best). Trang 30 Theo tính toán thời gian thực tế giải thuật từ 13300 -> 43100µs. - Average case: + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Theo tính toán thời gian thực tế giải thuật từ 41300 -> 59700µs. - Worst case: + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Trang 31 Theo tính toán thời gian thực tế giải thuật từ 21600 -> 38025µs. 5. Quick sort: - Pivot Mid: Best case + Ta có 100000 số kiểu integer -> 999999 xếp (Best). Theo tính toán thời gian thực tế giải thuật từ 28000 -> 43100µs. Average case: Trang 32 + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Theo tính toán thời gian thực tế giải thuật từ 31600 -> 56300µs. Worst case: + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Theo tính toán thời gian thực tế giải thuật từ 40000 -> 45000µs. - Pivot Low: Best case + Ta có 10000 số kiểu integer -> 999999 xếp (Best). Trang 33 Theo tính toán thời gian thực tế giải thuật 348231µs. Average case + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Theo tính toán thời gian thực tế giải thuật từ 47040 -> 63140µs. Worst case + Ta có 10000 số kiểu integer -> 999999 xếp ngược (Worst). Trang 34 Theo tính toán thời gian thực tế giải thuật ~952632µs. - Pivot Random: Best case + Ta có 100000 số kiểu integer -> 999999 xếp (Best). Theo tính toán thời gian thực tế giải thuật từ 28000 -> 43100µs. Average case + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Theo tính toán thời gian thực tế giải thuật từ 150000 -> 180000µs. Worst case Trang 35 + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Theo tính toán thời gian thực tế giải thuật ~192127µs. 6. Heap sort: - Best case: + Ta có 100000 số kiểu integer -> 999999 xếp (Best). Theo tính toán thời gian thực tế giải thuật từ 10000 -> 33100µs. - Average case: + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Trang 36 Theo tính toán thời gian thực tế giải thuật từ 92200 -> 113000µs. - Worst case: + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Theo tính toán thời gian thực tế giải thuật ~114074µs. 7. Radix sort: - Best case: + Ta có 100000 số kiểu integer -> 999999 xếp (Best). Trang 37 Theo tính toán thời gian thực tế giải thuật từ 20000 -> 30000µs. - Average case: + Ta có 100000 số kiểu integer -> 999999 chưa xếp (Ngẫu nhiên). Theo tính toán thời gian thực tế giải thuật từ 21300 -> 25300µs. - Worst case: + Ta có 100000 số kiểu integer -> 999999 xếp ngược (Worst). Trang 38 Theo tính toán thời gian thực tế giải thuật từ 21615 -> 32932µs. IV. Nhận xét kết Lý thuyết – Thực nghiệm: + Với liệu lớn kết thực nghiệm cho ta kết ưng ý trùng khớp với sở lý thuyết. + Tùy vào loại liệu giải thuật cho ta kết khác nhau. Không phải lúc giải thuật nhanh giải thuật kia. + Trước hết ta nói tốc độ thực thi giải thuật liệu input chung. Thì theo ta thấy Radix sort có thời gian thực thi nhất, nhanh tốn nhiều nhớ để xử lý, thay vào ta thấy Quick sort với pivot Mid tốc độ xử lý không nên ta bỏ qua Radix sort để rút Kết luận rằng: Quick sort (Mid) giải thuật chờ đợi. Trang 39 Chart Sorting 100000000 90000000 80000000 70000000 60000000 50000000 40000000 30000000 20000000 10000000 0 Insertion 1000 Selection Bubble 10000 Merge Trang 40 Quick 100000 Heap Radix Phần 2: Searching I. Cở sở lý thuyết Brute – Force: Trong khoa học máy tính , Brute-Force Search tìm kiếm đầy đủ , gọi tạo thử nghiệm, kỹ thuật giải vấn đề chung chung mà bao gồm liệt kê hệ thống tất ứng cử viên cho giải pháp kiểm tra xem ứng cử viên đáp ứng tuyên bố vấn đề. Một thuật toán brute-force để tìm ước số tự nhiên n liệt kê tất số nguyên từ đến bậc hai n, kiểm tra xem số họ chia n mà không lại. Một cách tiếp cận brute-force cho tám hoàng đố kiểm tra tất thỏa thuận có miếng bàn cờ 64 mét vuông, với xếp, kiểm tra xem (nữ hoàng) mảnh công khác. Trong tìm kiếm brute-force đơn giản để thực hiện, luôn tìm thấy giải pháp tồn tại, chi phí tỷ lệ thuận với số lượng giải pháp ứng cử viên - mà nhiều vấn đề thực tế có xu hướng phát triển nhanh chóng kích thước vấn đề tăng. Vì vậy, Brute-Force Search thường sử dụng kích thước vấn đề hạn chế, có vấn đề cụ thể chẩn đoán sử dụng để giảm giải pháp ứng cử viên quản lý. Phương pháp sử dụng thực đơn giản quan trọng tốc độ. Đây trường hợp, ví dụ, ứng dụng quan trọng mà sai sót thuật toán có hậu nghiêm trọng; hay sử dụng máy tính để chứng minh định lý toán học . Brute-force tìm kiếm hữu ích phương pháp điểm chuẩn thuật toán khác metaheuristics . Thật vậy, brute-force tìm kiếm xem metaheuristic đơn giản nhất. Tìm kiếm sức mạnh vũ phu không nên nhầm lẫn với quay lui , nơi tập hợp lớn giải pháp loại bỏ mà không liệt kê cách rõ ràng (như sách giáo khoa giải pháp máy tính để vấn đề tám hoàng trên). Các phương pháp brute-force cho việc tìm kiếm mục bảng - cụ thể là, rà soát tất mục sau này, - gọi tìm kiếm tuyến tính. Mã giả cho thuật tìm kiếm: ALGORITHM: BF_Search(A[0 n-1], K) //Tìm xem tồn K A hay không giải thuật tìm kiếm //Input: mảng A[0 n-1]; giá trị K //Output: vị trí phần tử K tìm thấy, -1 không tìm thấy K 1. i = Trang 41 2. while i < n and A[i] ≠ K 3. i = i + 4. if(i < n) //Nếu i < n nghĩa la tìm thấy K mảng A 5. return i //Trả vị trí tìm 6. else //Ngược lại, so sánh đến cuối mảng 7. return -1 //vẫn chưa tìm thấy, trả -1 8. end BF_Search Phân tích độ phức tạp: BigO: O(n) II. Thuật toán tìm kiếm Chia để trị: Khái niệm sơ bộ: Thuật toán dùng số vị trí mid (chính giữa), so sánh với key cần tìm, key lớn mid số cần tìm nằm bên phải, ngược lại, ta tìm vị trí key có hay không mảng. Phân tích độ phức tạp: BigO: O(logn) Kết luận: Từ khái niệm BigO ta kết luận thuật toán tìm kiếm chia để trị tốt Brute-Force. Nhưng liệu đầu vào phải mảng xếp tăng không giảm. http://en.wikipedia.org/wiki/Big_O_notation Trang 42 III. Thực nghiệm: Cài đặt thuật toán Brute-force: Thực tế Brute-force: Trang 43 Cài đặt thuật toán: Thực tế Chia để trị: Để hiểu rõ xin chạy chương trình thực nghiệm kèm theo bài… Trang 44 Tài Liệu Tham Khảo https://vi.wikipedia.org/wiki/Trang_Ch%C3%ADnh http://bayanbox.ir/view/4177858657730907268/introduction-to-algorithms-3rd-edition.pdf -----------//---THE END---//----------Cảm ơn Thầy/Cô xem qua em! Bài nhiều thiếu sót mong Thầy/Cô xem xét nhắc nhở để em bổ sung, hoàn thiện tốt hơn. Trang 45 [...]... Nhươc điểm Là thuật toán chạy nhanh nhất ở TH trung Trường hợp xấu nhất có thời gian O(n^2) bình Không cần bộ nhớ phụ Không ổn định Xài tốt cho danh sách liên kết 6 Heap sort : - Khái niệm : Thuật toán Heap sort hay còn gọi là thuật toán vun đống, đây là một thuật toán kinh điển với độ phức tạp cao hơn Bubble sort nhưng hiệu quả cao hơn Thuật toán Heap sort sử dụng cây nhị phân để giải thuật Cây nhị... tính toán thời gian thực tế của giải thuật là ~952632µs - Pivot Random: Best case + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Theo như tính toán thời gian thực tế của giải thuật là từ 28000 -> 43100µs Average case + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Theo như tính toán thời gian thực tế của giải thuật là từ 150000 -> 180000µs... tính toán thời gian thực tế của giải thuật là 54041794µs 2 Selection sort: - Best case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Trang 27 Theo như tính toán thời gian thực tế của giải thuật là 45436096µs - Average case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Theo như tính toán thời gian thực tế của giải thuật là 78696122µs - Worst... toán thời gian thực tế của giải thuật là 41036718µs 3 Bubble sort: - Best case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Theo như tính toán thời gian thực tế của giải thuật là từ 0 -> 1000µs - Average case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Trang 29 Theo như tính toán thời gian thực tế của giải thuật là từ 120000000 -> 17000000µs... toán thời gian thực tế của giải thuật là 161980827µs 4 Merge sort: - Best case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Trang 30 Theo như tính toán thời gian thực tế của giải thuật là từ 13300 -> 43100µs - Average case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Theo như tính toán thời gian thực tế của giải thuật là từ 41300 -> 59700µs... gian thực tế của giải thuật là từ 21600 -> 38025µs 5 Quick sort: - Pivot Mid: Best case + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Theo như tính toán thời gian thực tế của giải thuật là từ 28000 -> 43100µs Average case: Trang 32 + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Theo như tính toán thời gian thực tế của giải thuật là từ 31600... tính toán thời gian thực tế của giải thuật là từ 40000 -> 45000µs - Pivot Low: Best case + Ta có 10000 số kiểu integer bắt đầu từ 0 -> 999999 đã sắp xếp (Best) Trang 33 Theo như tính toán thời gian thực tế của giải thuật là 348231µs Average case + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Theo như tính toán thời gian thực tế của giải thuật là từ 47040 -> 63140µs... như tính toán thời gian thực tế của giải thuật là từ 0 -> 2500µs + Ta có 1 triệu số kiểu integer bắt đầu từ 0 -> 9999999 đã sắp xếp Theo như tính toán thực tế thì thời gian thực thi giải thuật là từ 11000 -> 14000µs - Average case: + Ta có 100000 số kiểu integer bắt đầu từ 0 -> 999999 chưa sắp xếp (Ngẫu nhiên) Trang 26 Theo như tính toán thời gian thực tế của giải thuật là từ 26800000 -> 293µs - Worst... 8425 9170 9 9170 Nhận xét: Giải thuật Radix Sort không dựa trên sự so sánh dữ liệu như các giải thuật sắp xếp khác Với mỗi số nguyên từ dữ liệu sẽ có hai hành động được thực thi + Thực hiện phép chia lấy nguyên cho 1 hệ số để lấy phần chữ số d và các chữ số trước nó (bỏ các chữ số sau nó) + Thực hiện phép chia lấy dư cho 10 để lấy ra chữ số d (bỏ các chữ số trước d) - Cài đặt thuật toán: - Phân tích độ... Nếu mảng con thứ 2 có nhiều hơn 1 ptử thì sort mảng con này bằng thuật toán Quick Sort Trang 13 - Cài đặt thuật toán : + Pivot Mid: + Pivot Low (Vị trí đầu): Trang 14 + Pivot Random (Ngẫu nhiên): Trang 15 - Phân tích độ phức tạp: Với dữ liệu input như nhau ta có thể chia ra 2 TH: ++ TH tốt nhất (Pivot ở MID): Ta có mảng a[0,1,…n-1], theo thuật toán ta sẽ có 2 mảng: + Mảng 1: có k phần tử (hay n/2) + . tự nào đó và điều này đòi hỏi chúng ta phải xây dựng những giải thuật sắp xếp thích hợp. Bài báo cáo này nhằm mục đích giới thiệu về Sorting & Searching. Hy vọng nhận được những nhận xét