Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
273,54 KB
Nội dung
1 MỞ ĐẦU 1.1 LÍ DO CHỌN ĐỀ TÀI Khi giải tốn có số giải thuật khác nhau, vấn đề cần phải đánh giá giải thuật để lựa chọn giải thuật tốt Với chương trình sử dụng nhiều lần yêu cầu tiết kiệm thời gian thực chương trình lại quan trọng đặc biệt chương trình mà thực cần liệu vào lớn giải thuật thực nhanh xem xét cách kĩ Hay nói cách khác để xác định thuật tốn chạy nhanh hay chậm ta cần đo độ phức tạp thuật toán Đây nội dung quan trọng việc bồi dưỡng cho học sinh ôn thi đội tuyển Tin học Xuất phát từ lí trên, từ kinh nghiệm năm giảng dạy thực tế vừa qua, xây dựng đề tài: “Đánh giá độ phức tạp thuật tốn thơng qua thuật toán xếp bồi dưỡng học sinh giỏi môn Tin học trường THPT Tĩnh Gia 2” 1.2 MỤC ĐÍCH NGHIÊN CỨU Mục đích quan trọng đề tài làm để học sinh nh ận thấy để giải tốn có nhiều cách, có nhiều thuật tốn Tuỳ theo u cầu toán mà ta chọn thuật toán phù hợp tối ưu 1.3 ĐỐI TƯỢNG NGHIÊN CỨU Học sinh tham gia đội tuyển học sinh giỏi môn Tin học trường THPT Tĩnh Gia 1.4 PHƯƠNG PHÁP NGHIÊN CỨU - Phương pháp nghiên cứu lý thuyết: Độ phức tạp thuật toán - Phương pháp thực tiễn: Đánh giá độ phức tạp thuật toán thuật tốn xếp - Phương pháp thực nghiệm thơng qua thực tế dạy bồi dưỡng học sinh giỏi môn Tin học - Phương pháp thống kê, xử lý số liệu: xử lý kết kiểm tra học sinh hai nhóm: đối chứng thực nghiệm NỘI DUNG 2.1 CƠ SỞ LÍ LUẬN 2.1.1 Thời gian thực chương trình Một phương pháp để xác định hiệu thời gian thực giải thuật lập trình đo lường thời gian thực hoạt động máy tính xác định tập hợp chọn lọc liệu vào Thời gian thực không phụ thuộc vào giải thuật mà phụ thuộc vào tập thị máy tính, chất lượng máy tính kĩ xảo người lập trình Sự thi hành điều chỉnh để thực tốt tập đặc biệt liệu vào chọn Ðể vượt qua trở ngại này, nhà khoa học máy tính chấp nhận tính phức tạp thời gian tiếp cận đo lường thực thi giải thuật Thuật ngữ tính hiệu đề cập đến đo lường đặc biệt phức tạp thời gian trường hợp xấu * Thời gian thực chương trình Thời gian thực chương trình hàm kích thước liệu vào, ký hiệu T(n) n kích thước (độ lớn) liệu vào Chương trình tính tổng n số có thời gian thực T(n) = cn c số Thời gian thực chương trình hàm khơng âm, tức T(n) ≥ với n ≥ * Ðơn vị đo thời gian thực Ðơn vị T(n) đơn vị đo thời gian bình thường giờ, phút giây… mà thường xác định số lệnh thực máy tính lý tưởng Khi ta nói thời gian thực chương trình T(n) = Cn có nghĩa chương trình cần Cn thị thực thi * Thời gian thực trường hợp xấu Nói chung thời gian thực chương trình khơng phụ thuộc vào kích thước mà cịn phụ thuộc vào tính chất liệu vào Nghĩa liệu vào có kích thước thời gian thực chương trình khác Chẳng hạn chương trình xếp dãy số nguyên tăng dần, ta cho vào dãy có thứ tự thời gian thực khác với ta cho vào dãy chưa có thứ tự, ta cho vào dãy có thứ tự tăng thời gian thực khác so với ta cho vào dãy có thứ tự giảm Vì thường ta coi T(n) thời gian thực chương trình trường hợp xấu liệu vào có kích thước n, tức là: T(n) thời gian lớn để thực chương trình liệu vào có kích thước n 2.1.2 Tỷ suất gia tăng độ phức tạp giải thuật * Tỷ suất tăng Ta nói hàm khơng âm T(n) có tỷ suất tăng f(n) Ta chứng minh Cho hàm khơng âm T(n) bất kỳ, ta ln tìm tỷ suất tăng f(n) Giả sử tổng quát: Ðặt với n ≥1 dễ dàng chứng minh rằng: , tức tỷ suất tăng Tỷ suất tăng hàm Thực vậy, cho ta dễ dàng chứng minh * Khái niệm độ phức tạp giải thuật Giả sử ta có hai giải thuật P1 P2 với thời gian thực tương ứng là: Giải thuật thực nhanh hơn? Câu trả lời phụ thuộc vào kích thước liệu vào Với n < 20 P2 nhanh P1 (T2 a[j] tốn O(1) thời gian, lệnh {3} tốn O(1) thời gian Vịng lặp {2} thực (n-i) lần, lần O(1) vịng lặp {2} tốn O((n-i).1) = O(n-i).Vịng lặp {1} lặp có i chạy từ đến n-1 nên thời gian thực vòng lặp {1} độ phức tạp giải thuật là: Chú ý: Trong trường hợp vịng lặp khơng xác định số lần lặp phải lấy số lần lặp trường hợp xấu * Ðộ phức tạp chương trình có gọi chương trình khơng đệ quy Nếu có chương trình với chương trình khơng đệ quy, để tính thời gian thực chương trình, trước hết tính thời gian thực chương trình khơng gọi chương trình khác Sau tính thời gian thực chương trình gọi chương trình mà thời gian thực chúng tính Chúng ta tiếp tục q trình đánh giá thời gian thực chương trình sau thời gian thực tất chương trình mà gọi đánh giá Cuối ta tính thời gian cho chương trình Giả sử ta có hệ thống chương trình gọi theo sơ đồ sau: Chương trình A gọi hai chương trình B C, chương trình B gọi hai chương trình B1 B2, chương trình B1 gọi hai chương trình B11 B12 Ðể tính thời gian thực A, ta tính theo bước sau: Tính thời gian thực C, B2, B11 B12 Vì chương trình khơng gọi chương trình Tính thời gian thực B1 Vì B1 gọi B11 B12 mà thời gian thực B11 B12 tính bước Tính thời gian thực B Vì B gọi B1 B2 mà thời gian thực B1 tính bước thời gian thực B2 tính bước Tính thời gian thực A Vì A gọi B C mà thời gian thực B tính bước thời gian thực C tính bước Chúng ta xét thủ tục MergeSort cách phác thảo sau: FUNCTION MergeSort (L:List; n:Integer):List; VAR L1,L2:List; BEGIN IF n=1 THEN RETURN(L) ELSE BEGIN Chia đôi L thành L1 L2, với độ dài n/2; RETURN(Merge(MergeSort(L1,n/2),MergeSort(L2,n/2))); END; END; Chẳng hạn để xếp danh sách L gồm phần tử 7, 4, 8, 9, 3, 1, 6, ta có mơ hình minh họa MergeSort sau: Hàm MergeSort nhận danh sách có độ dài n trả danh sách xếp Thủ tục Merge nhận hai danh sách L1 L2 danh sách có độ dài n/2 trộn chúng lại với để danh sách gồm n phần tử có thứ tự Giải thuật chi tiết Merge ta bàn sau, để ý thời gian để Merge danh sách có độ dài n/2 O(n) Gọi T(n) thời gian thực MergeSort danh sách n phần tử T(n/2) thời gian thực MergeSort danh sách n/2 phần tử Khi L có độ dài (n = 1) chương trình làm việc return(L), việc tốn O(1) = C1 thời gian Trong trường hợp n > 1, chương trình phải thực gọi đệ quy MerSort hai lần cho L1 L2 với độ dài n/2 thời gian để gọi hai lần đệ quy 2T(n/2) Ngồi cịn phải tốn thời gian cho việc chia danh sách L thành hai nửa trộn hai danh sách kết (Merge) Người ta xác đinh thời gian để chia danh sách Merge O(n) = C2n Vậy ta có phương trình đệ quy sau: Bảng sau cho ta cấp thời gian thực thuật toán sử dụng rộng rãi tên gọi chúng Ký hiệu O(f(x)) f(x) O(1) O(log) O(n) O(nlogn) O(n2) O(n3) O(2n) O(n!) Độ phức tạp loại Hằng Logarit Tuyến tính n log n Bình phương Lập phương Mũ Giai thừa 2.2 THỰC TRẠNG CỦA VẤN ĐỀ Hầu hết toán có nhiều thuật tốn khác để giải chúng Như vậy, làm để chọn cài đặt tốt nhất? Đây lĩnh vực phát triển tốt nghiên cứu khoa học máy tính Chúng ta thường xun có hội tiếp xúc với kết nghiên cứu mô tả tính thuật tốn Tuy nhiên, việc so sánh thuật toán cần thiết chắn vài dòng hướng dẫn tổng quát phân tích thuật tốn hữu dụng Khi nói đến hiệu thuật tốn, người ta thường quan tâm đến chi phí cần dùng để thực Chi phí thể qua việc sử dụng tài nguyên nhớ, thời gian sử dụng CPU, … Ta đánh giá thuật tốn phương pháp thực nghiệm thông qua việc cài đặt thuật toán chọn liệu thử nghiệm Thống kê thông số nhận chạy liệu ta có đánh giá thuật toán Tuy nhiên, phương pháp thực nghiệm gặp số nhược điểm sau khiến cho khó có khả áp dụng thực tế: - Do phải cài đặt ngơn ngữ lập trình cụ thể nên thuật tốn chịu hạn chế ngữ lập trình - Đồng thời, hiệu thuật toán bị ảnh hưởng trình độ người cài đặt - Việc chọn liệu thử đặc trưng cho tất tập liệu vào thuật tốn khó khăn tốn nhiều chi phí - Các số liệu thu nhận phụ thuộc nhiều vào phần cứng mà thuật toán thử nghiệm Điều khiến cho việc so sánh thuật tốn khó khăn chúng thử nghiệm nơi khác Vì lý trên, việc tìm kiếm phương pháp đánh giá thuật tốn hình thức hơn, phụ thuộc mơi trường phần cứng quan trọng 2.3 ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA CÁC THUẬT TOÁN SẮP XẾP 2.3.1 THUẬT TOÁN SẮP XẾP NỔI BỌT Ý trưởng Ý trưởng phương pháp xếp này: Thuật toán xếp bọt thực xếp dãy số cách lặp lại công việc đổi chỗ số liên tiếp chúng đứng sai thứ tự(số sau bé số trước với trường hợp xếp tăng dần) dãy số xếp Chương trình #include using namespace std; long a[10000000], i, j, n,tam; void swap(int &a, int &b) { int x = a; a = b; b = x; }int main() { freopen ("SAPXEP.INP", "r", stdin); freopen ("SAPXEP.OUT", "w", stdout); ios_base::sync_with_stdio(false); cin >> n; for (i=1; i > a[i]; for (j=n; j >= 2; j ) for (i=1; i a[i+1]) { swap(a[i],a[i+1]); } for (i=1; i n; for (int i=0; i > a[i]; insertionSort(a,n); for (int i=0; i a[i]; HeapSort(a,n); for (int i=0; i