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

42 1.7K 2
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

Nhưng thế nào là thuật toán tốt? Thước đo hiệu quả là thời gian máy tính sử dụng để giải bài toán theo thuật toán đang xét khi các giá trị đầu vào có kích thước xác định

Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp NGHIÊN CỨU KHOA HỌC Đề tài : Tìm hiểu về Thuật Toán Sắp Xếp Mục lục NGHIÊN CỨU KHOA HỌC 1 Đề tài : Tìm hiểu về Thuật Toán Sắp Xếp .1 1 Nghiên cứu khoa học Mơ phỏng thuật tốn sắp xếp Mục lục 1 PHẦN MỞ ĐẦU .3 1. Lý do chọn đề tài .3 2. Mục tiêu và nhiệm vụ 4 Chương 1. MỘT SỐ KIẾN THỨC CƠ SỞ 5 1.1.Thuật tốn 5 1.1.1.Khái niệm thuật tốn 5 1.1.2.Các đặc trưng của thuật tốn 6 Chương 2. MƠ PHỎNG THUẬT TỐN .8 2.1.Tổng quan về mơ phỏng thuật tốn .8 2.1.1.Khái niệm mơ phỏng thuật tốn .8 2.1.2. Lịch sử mơ phỏng thuật tốn .9 2.1.3.Tác dụng của mơ phỏng thuật tốn 11 2.1.4.Kiến trúc của hệ thống mơ phỏng thuật tốn 14 2.1.5.Lựa chọn cơng cụ mơ phỏng thuật tốn .16 2.2.Một số u cầu đối với mơ phỏng thuật tốn 16 2.2.1.Mơ tả đúng theo thuật tốn .16 2.2.2.Hệ thống mơ phỏng phải được thực hiện theo từng bước .17 2.2.3.Mơ phỏng thuật tốn phải có tính động 17 2.2.4.Phải tạo ra sự phân cấp cho người học .17 2.2.5.Cấu trúc của mơ phỏng thuật tốn 17 2.3.Quy trình thiết kế nhiệm vụ mơ phỏng thuật tốn .18 2.3.1.Nghiên cứu và phân tích giải thuật .18 2.3.2.Phân tích giải thuật thành nhiều bước, sau đó lần lượt mơ phỏng từng bước đó .21 2.3.3.Phân tích khả năng tổng hợp các bước đã phân tích thành giải thuật .21 2.3.4.Phân tích những khó khăn và thuận lợi với những người lần đầu tiên biết đến giải thuật .21 2.4.Kết luận .22 CHƯƠNG 3 : CHƯƠNG TRÌNH ỨNG DỤNG THUẬT TỐN SẮP XẾP .23 3.1 CÁC THUẬT TỐN SẮP XẾP ĐƠN GIẢN 24 3.1.1 Sắp xếp lựa chọn 24 3.1.2 Sắp xếp xen vào .26 3.1.3 Sắp xếp nổi bọt .27 3.2 SẮP XẾP HỒ NHẬP 29 3.3 SẮP XẾP NHANH 32 3.4 SẮP XẾP SỬ DỤNG CÂY THỨ TỰ BỘ PHẬN .39 2 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp PHẦN MỞ ĐẦU 1. Lý do chọn đề tài Trong hai thập kỷ qua, mô phỏng thuật toán đã được các nhà sư phạm của ngành công nghệ thông tin sử dụng như một công cụ có tính chất giúp đỡ trong việc dạy các thuật toán đồ thị, các thuật toán sắp xếp, … khác nhau bằng máy tính. Nguyên nhân của việc mô phỏng thuật toán được sử dụng như một công cụ trợ giúp cho việc giảng dạy là do nó có 3 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp thể cung cấp các mô phỏng động bằng đồ họa của một thuật toán và các thay đổi trong cấu trúc dữ liệu của nó trong suốt quá trình thực thi. Như một phần của quá trình học thuật toán, những sinh viên ngành công nghệ thông tin sẽ học về cấu trúc của một trình biên dịch (compiler) trong một ngôn ngữ lập trình cho quá trình đó. Điều này sẽ chỉ ra cho chúng ta từng nhiệm vụ của các giai đoạn khác nhau trong trình biên dịch. Hiện nay, một số hệ thống mô phỏng thuật toán được phát triển sau hai thập kỷ. Hầu hết các thuật toán được đề cập đến trong giai đoạn này đều là các hệ thống phổ biến hơn và tinh vi hơn các hệ thống mà thực tế đang sử dụng. Mô phỏng thuật toán ngày càng trở nên hữu ích và trở thành một giáo cụ trực quan rất quan trọng trong hầu hết các lĩnh vực, nhất là trong môi trường giáo dục. Với các nhà sư phạm của ngành công nghệ thông tin thì mô phỏng thuật toán có tác dụng như một tài liệu hướng dẫn trong việc dạy các thuật toán bằng máy tính. Đặc biệt, nó giúp học sinh và sinh viên hiểu cấu trúc dữ liệu và thuật toán nhanh hơn. Như vậy, mô phỏng thuật toán góp phần to lớn vào việc ứng dụng CNTT trong giảng dạy và góp phần vào sự phát triển nhanh chóng của hệ thống elearning. Thuật toán về sắp xếp rất đa dạng và phong phú. Vì vậy vấn đề “ Mô phỏng thuật toán sắp xếp ” được chọn để nghiên cứu trong khóa luận này. 2. Mục tiêu và nhiệm vụ • Nghiên cứu tổng quan về mô phỏng thuật toán. • Hướng đến các kỹ thuật lập trình với mã nguồn mở và ngôn ngữ lập trình C# • Áp dụng kết quả nghiên cứu làm một demo mô phỏng thuật toán sắp xếp 3. Cấu trúc khóa luận Chương 1: Một số kiến thức cơ sở • Trình bày khái niệm thuật toán, các đặc trưng của thuật toán • Độ phức tạp của thuật toán Chương 2: Mô phỏng thuật toán • Tổng quan về mô phỏng thuật toán 4 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp • Một số yêu cầu đối với mô phỏng thuật toán • Quy trình thiết kế nhiệm vụ mô phỏng thuật toán Chương 3: Chương trình ứng dụng thuật toán sắp xếp Phân tích và thiết kế hệ thống mô phỏng thuật toán sắp xếp • Phân tích một số thuật toán hiện tại Chương 1. MỘT SỐ KIẾN THỨC CƠ SỞ 1.1. Thuật toán 1.1.1. Khái niệm thuật toán Thuật ngữ “algorithm” (thuật toán hoặc còn gọi là giải thuật) được gọi theo tên nhà toán học Ả rập thế kỷ IX al-Khowarizmi, người đã viết cuốn sách về các chữ số Hindu – cơ sở của kí hiệu số thập phân hiện đại (xem [4], trang 118). Xuất xứ ban đầu là từ algorism, được dùng để chỉ các quy tắc thực hiện các phép tính số học trên các số thập phân. Sau đó, vào thế kỷ XVIII algorism biến thành algorithm. Với sự quan tâm ngày càng tăng đối với máy tính, khái niệm thuật toán đã được cho một ý nghĩa chung hơn, bao hàm cả các thủ tục xác định để giải các bài toán, chứ không phải chỉ là thủ tục để thực hiện các phép tính số học. Thuật toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy các thao tác ấy, từ Input của bài toán ta nhận được Output cần tìm. Cũng có thế xem thuật toán như một công cụ để giải quyết một bài toán cụ thể. Phát biểu bài toán sẽ chỉ định tổng quát mối quan hệ Input/Output cần thiết. Thuật toán mô tả một thủ tục tính toán cụ thể để đạt được mối quan hệ Input/Output đó. 5 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp Vào khoảng những năm 1930 - 1936, lần lượt các nhà toán học K.Gödel, S. Kleene, A. Church, A. Turing đã đề ra một số định nghĩa khác nhau cho khái niệm thuật toán. Trong số các định nghĩa toán học khác nhau (nhưng tương đương) về thuật toán, các khái niệm Máy Turing (1937) và Hàm đệ quy (1931-1936) được sử dụng rộng rãi hơn vì có nhiều thuận tiện cho các nghiên cứu cả về lí thuyết lẫn thực hành. 1.1.2. Các đặc trưng của thuật toán Các thuật toán có một số tính chất chung, đó là: • Đầu vào (Input): Một thuật toán có các giá trị đầu vào từ một tập xác định. • Đầu ra (Output): Từ mỗi tập giá trị đầu vào, thuật toán sẽ tạo ra các giá trị đầu ra. Các giá trị đầu ra chính là nghiệm của bài toán. • Tính xác định: Các bước của thuật toán phải được xác định một cách chính xác. • Tính đúng đắn: Một thuật toán phải cho các giá trị đầu ra đúng đối với mỗi tập giá trị đầu vào. • Tính hữu hạn: Một thuật toán phải tạo ra các giá trị đầu ra sau một số hữu hạn (có thể rất lớn) các bước thực hiện đối với mỗi tập đầu vào. • Tính hiệu quả: Mỗi bước của thuật toán phải thực hiện được một cách chính xác và trong một khoảng thời gian chấp nhận được. • Tính tổng quát: Thuật toán cần phải áp dụng được cho mọi tập dữ liệu đầu vào của bài toán, chứ không phải chỉ cho một tập đặc biệt các giá trị đầu vào. 1.2.Độ phức tạp của thuật toán Cần chú ý rằng mỗi thuật toán chỉ giải một lớp bài toán nào đó, nhưng có thể có nhiều thuật toán khác nhau giải cùng một bài toán. Một vấn đề đặt ra là ta cần chọn một thuật toán tốt để giải bài toán đã cho. 6 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp Nhưng thế nào là thuật toán tốt? Thước đo hiệu quả là thời gian máy tính sử dụng để giải bài toán theo thuật toán đang xét khi các giá trị đầu vào có kích thước xác định, và dung lượng bộ nhớ đòi hỏi để thực hiện thuật toán đó. Như vậy khi xem xét đến độ phức tạp tính toán của thuật toán ta phải xem xét đến độ phức tạp thời gian và độ phức tạp không gian. Độ phức tạp không gian gắn liền với cấu trúc dữ liệu cụ thể được dùng để thực hiện thuật toán. Độ phức tạp thời gian: Độ phức tạp thời gian của một thuật toán có thể biểu diễn qua số phép toán thực hiện thuật toán đó khi các giá trị đầu vào có kích thước xác định. Độ phức tạp trong trường hợp xấu nhất là trường hợp phải dùng tối đa các phép toán để giải bài toán theo thuật toán đang xét. Độ phức tạp trong trường hợp trung bình, trong trường hợp này ta phải đi tìm số trung bình các phép toán để giải bài toán trên toàn bộ các 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 của thuật toán: O(1): Độ phức tạp hằng số O(logn): Độ phức tạp lôgarit O(n): Độ phức tạp tuyến tính O(nlogn): Độ phức tạp nlogn O(n b ): Độ phức tạp đa thức O(b n ), b > 1: Độ phức tạp hàm mũ O(n!): Độ phức tạp giai thừa 7 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp Chương 2. MÔ PHỎNG THUẬT TOÁN 2.1. Tổng quan về mô phỏng thuật toán 2.1.1. Khái niệm mô phỏng thuật toán Mô phỏng thuật toán là quá trình tách dữ liệu, thao tác, ngữ nghĩa và tạo mô phỏng đồ họa cho quá trình trên [Stasko 1990] (xem [23]). Mô phỏng thuật toán được thiết kế để giúp người dùng có thể hiểu thuật toán, đánh giá chương trình và sửa lỗi chương trình. Một chương trình máy tính chứa các cấu trúc dữ liệu của thuật toán mà nó thực thi. Trong quá trình thực thi chương trình, các giá trị trong cơ sở dữ liệu được thay đổi. Mô phỏng thuật toán sử dụng biểu diễn đồ họa để biểu diễn cấu trúc dữ liệu và chỉ ra sự thay đổi giá trị trong cơ sở dữ liệu trong mỗi trạng thái. Thông qua đó, người sử dụng có thể xem được từng bước thực thi chương trình và nhờ vậy có thể hiểu chi tiết được thuật toán. Mô phỏng thuật toán cũng được dùng để đánh giá một chương trình đã có bằng cách cung cấp các mô phỏng cho các thành phần của hệ thống, nhờ đó có thể kiểm tra được hiệu năng của hệ thống. 8 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp Bên cạnh việc giúp người sử dụng hiểu hơn về hệ thống, mô phỏng thuật toán còn được dùng để giúp thực hiện quá trình dò lỗi dễ dàng hơn. Để sử dụng mô phỏng thuật toán trong quá trình dò lỗi của một chương trình, người sử dụng chú thích vào các trạng thái của chương trình để tạo ra các lệnh mô phỏng, sau đó chúng sẽ được đưa vào hệ thống mô phỏng thuật toán để tạo mô phỏng. Người sử dụng có thể xem chương trình của họ đã thực hiện như thế nào, các giá trị dữ liệu ở mỗi bước và một bước sẽ ảnh hưởng tới các bước sau như thế nào. Nó sẽ giúp người sử dụng tìm ra tất cả các lỗi có thể xảy ra trong chương trình. 2.1.2. Lịch sử mô phỏng thuật toán Mô phỏng thuật toán đã được xây dựng từ hai thập kỷ gần đây. Nhưng chương trình mô phỏng thuật toán đầu tiên là của Ken Knowlton ở Bell Telephone Laboratories khi mô phỏng ngôn ngữ liên kết danh sách vào năm 1966. Mô phỏng thuật toán phát triển mạnh vào đầu những năm 80 của thế kỷ 20. Vào năm 1981, video (sorting out sorting) được xây dựng bởi Ronald Baecker ở đại học Toronto được coi là khởi điểm của lĩnh vực mô phỏng thuật toán. Từ đó các nhà giáo dục đã sử dụng mô phỏng thuật toán để trợ giúp quá trình dạy học. Giữa những năm 80 và đầu những năm 90, hai hệ thống có ảnh hưởng mạnh đến về sau được phát triển và có ý nghĩa lớn trên tất cả những hệ thống sau này. Hai hệ thống này là BALSA-I (Brown ALgorithm Simulator and Animator) [Brown 1984] và TANGO (Transition-based Animation GeneratiOn) [Stasko 1990]. BALSA-I là hệ thống mô phỏng thuật toán nổi tiếng rộng khắp đầu tiên. Nó được phát triển bởi Marc Brown và Robert Sedgewick tại trường đại học Brown. BALSA-I là hệ thống mô phỏng thuật toán tương tác mà hỗ trợ đồng thời nhiều cái nhìn của một cấu trúc dữ liệu thuật toán và có thể hiển thị nhiều thuật toán thực thi đồng thời. Sự phát triển của nó là động cơ thúc đẩy các nhà nghiên cứu khác tham gia vào việc phát triển các hệ thống mô phỏng thuật toán khác nữa. Một hệ thống khác là TANGO, được phát triển bởi John Stasko của trường đại học Brown. Sự nổi bật của TANGO là chỉ ra mô hình path-transition để thiết kế mô phỏng và một framework cho hệ thống mô phỏng thuật toán. Nó đưa ra một khái niệm framework 9 Nghiên cứu khoa học Mô phỏng thuật toán sắp xếp mới mà được chấp nhận bởi một số hệ thống sau này như kiến trúc cơ sở của chúng. Kiến trúc này sẽ được mô tả trong mục tiếp theo. Từ khi hai hệ thống của BALSA và TANGO được phát triển, các hệ thống đi sau của hai hệ thống đáng chú ý này cũng được phát triển. BALSA-I có một hệ thống đi sau đó là BALSA-II [Brown 1988]. BALSA-II là một hệ thống mô phỏng thuật toán vùng-độc lập thao tác các ảnh với nhiều cái nhìn và cung cấp quá trình tạo ra bộ điều khiển dễ dàng. TANGO thì khác, có nhiều hệ thống đi sau. XTANGO [Stasko 1992] là hệ thống trực tiếp đi sau TANGO. POLKA được thiết kế để xây dựng mô phỏng đồng thời cho các chương trình song song. Nó là một hệ thống mô phỏng thuật toán hướng đối tượng 2-D và được mở rộng thành hệ thống 3-D, POLKA 3-D. POLKA 3-D cung cấp cái nhìn 3-D và 3-D nguyên thủy, ví dụ như: hình nón, hình cầu, hình lập phương và một số hình khác nữa. Người dùng không bị yêu cầu phải có hiểu biết trước về đồ họa máy tính 3-D để sử dụng POLKA 3-D. Samba cho phép thể hiện mô phỏng tương tác mà đọc các câu lệnh ASCII và thực hiện các hành động mô phỏng tương ứng. Có một phiên bản Java của Samba được gọi là JSamba (xem http://www.cc.gatech.due/gvu/softviz/parviz/ samba.html). Các hệ thống mô phỏng thuật toán khác bao gồm: Zeus, Leonardo, CATAI, Mocha. Zeus [Brown 1991] được phát triển tại trường đại học Brown cùng với BALSA và BALSA-II, nó được coi như một trong số các hệ thống phần mềm có ảnh hưởng lớn đến nhau đầu tiên. Zeus được thực thi trong môi trường multi-threaded và multi-processor, vì thế nó có thể làm cho các chương trình song song. CATAI (xem http://wonderland.dia.unisa.it/catai/) là một hệ thống mô phỏng các chương trình C++. Nó tin tưởng vào những công nghệ đối tượng phân tán và cho phép một vài người dùng chia sẻ mô phỏng đó thông qua sự trừu tượng hóa lớp học thực tế. Truyền thông và sự đồng bộ hóa giữa các khách hàng mô phỏng và thuật toán được mô phỏng được đảm bảo bởi người phục vụ mô phỏng Java mà sử dụng công nghệ CORBA. Mocha (xem http://www.cs.brown.edu/people/jib/Mocha.html) là một mô hình phân tán với kiến trúc client-server nhằm tối ưu phân chia những thành phần của phần mềm trong một hệ thống mô phỏng thuật toán tiêu biểu. Trong mô hình Mocha, chỉ mã giao diện được xuất tới máy người dùng, trong khi thuật toán được thực hiện trên một server chạy trên máy của nhà cung cấp. 10 [...]... chúng ta trình bày thuật toán sắp xếp được đưa ra bởi Hoare, nổi tiếng với tên gọi là sắp xếp nhanh (QuickSort) Thời gian chạy của thuật toán này trong trường hợp xấu nhất là O(n 2) Tuy nhiên thời gian chạy trung bình là O(n logn) Thuật toán sắp xếp nhanh được thiết kế bởi kỹ thuật chia-để-trị như thuật toán sắp xếp hòa nhập Nhưng trong thuật toán sắp xếp hòa nhập, mảng A[a…b] cần sắp được chia đơn... loại: sắp xếp trong và sắp xếp ngoài Sắp xếp trong được thực hiện khi mà các đố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 quá lớn cần lưu ở bộ nhớ ngoài dưới dạng file, ta cần sử dụng các phương pháp sắp xếp ngoà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 toán sắp. .. // Khoá sắp xếp // Các trường dữ liệu khác }; 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 . Mô phỏng thuật toán sắp xếp điều khiển (event-driven), nghĩa là chúng có một chương trình phát sinh những sự kiện trong dạng. được xuất tới máy người dùng, trong khi thuật toán được thực hiện trên một server chạy trên máy của nhà cung cấp. 10 Nghiên cứu khoa học

Ngày đăng: 25/04/2013, 21:55

Từ khóa liên quan

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

Tài liệu liên quan