HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM

35 99 0
HIỆU QUẢ CỦA CHIA ĐỂ TRỊ  TRONG SẮP XẾP VÀ TÌM KIẾM

Đ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

SỞ GIÁO DỤC VÀ ĐÀO TẠO XXX Trường : THPT Chuyên XXXX ĐỀ TÀI: HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM TÁC GIẢ: XXXXXXX LĨNH VỰC: TỰ NHIÊN Năm học 2014 -2015 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM MỤC LỤC A ĐẶT VẤN ĐỀ C KẾT LUẬN VÀ KIẾN NGHỊ 33 TÀI KIỆU THAM KHẢO 35 A ĐẶT VẤN ĐỀ Lý chän ®Ị tµi: Trong tin học, tốn việc mà ta muốn máy tính thực hiện, để giải tốn cần có thuật tốn Thuật toán dãy hữu hạn thao tác xếp theo trình tự xác định cho từ input sau thực dãy thao tác ta thu output cần tìm tốn Như toán có HIU QU CA CHIA TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM thĨ dïng rÊt nhiều thut toỏn để giải quyết, vấn đề chọn thut toỏn no hay phơng pháp phù hợp với kiểu để đạt hiệu cao Trong chương trinh Tin học phổ thơng nói Chương trình tin học chuyên sâu nói riêng có số thuật toán để giải lớp toán định như: thuật tốn Sắp xếp, tìm kiếm số phương pháp thiết kế thuật toán như: Chia để trị, tham lam, quy hoạch động Từ thực tế giảng dạy thân nhận thấy việc nắm vững thuật tốn áp dụng cách linh hoạt tập định không đơn giản Sắp xếp tìm kiếm hai tốn quen thuộc, nhiều học sinh cài đặt chương trình xếp hay tìm kiếm cách dễ dàng Tuy nhiên để nhận dạng tốn thực với thuật tốn khơng phải dễ, ngồi để cài đặt thuật tốn hiệu địi hỏi người lập trình nắm vững phương pháp thiết kế thuật giải Trong thiết kế thuật giải Chia để trị (Divide and Conquer) phương pháp quen thuộc sử dụng để giải nhiều tốn Chúng ta áp dụng phương pháp toán xếp tìm kiếm Với tư tưởng chia để trị cải thiện đáng kể độ phức tạp thuật toán toán xếp tìm kiếm Tư tưởng chia để trị xếp tìm kiếm viết nhiều tài kiệu khác nhau, đề tài tập trung đưa số dạng tập từ phổ biến đến khó áp dụng phương pháp phân tích tính hiệu tốn Vì tơi chọn đề tài: “Hiệu chia để trị xếp tìm kiếm” HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Mục đích nghiên cứu Trong phạm vi đề tài tơi muốn nghiên cứu số phương pháp phương pháp hiệu việc giải tốn tin học nhằm giúp học sinh hình thành kỹ giải toán tin học rèn luyện tư thuật tốn từ rèn luyện tư lập trình Cũng qua đề tài, tơi muốn đồng nghiệp trao đổi, trau dồi chun mơn nhằm góp phần nâng cao trình độ chun mơn nghiệp vụ khả mở rộng kiến thức Với thân nghiên cứu đề tài sáng kiến kinh nghiệm hội tốt để nghiên cứu khoa học làm quen với phương pháp làm khoa học phạm vi hẹp hy vọng với nổ lực thân giúp đỡ đồng nghiệp có đề tài khoa học tốt, lý thú hiệu Nhiệm vụ nghiên cứu Giáo viên hoàn thành nội dung đề tài định hướng cho học sinh thực đề tài trình ụn tập luyện thi học sinh giỏi Bỏo cỏo thành chuyên đề lần họp tổ chuyên môn để đồng nghiệp bổ sung thiếu sút đề tài Học sinh hướng dẫn Giáo viên nghiêm túc nghiên cứu đề tài có định hướng phát triển khả lập trình thõn Phạm vi đề tài: Đề tài áp dụng học sinh khỏ giỏi với nhiệm vụ chủ yếu ụn thi học sinh giỏi bồi dưỡng kiến thức cho học sinh yờu thớch mụn tin Phương pháp nghiên cứu: Để hồn thành đề tài này, tơi tiến hành áp dụng số phương pháp nghiên cứu sau: Phương pháp đặt vấn đề - giải vấn đề Phương pháp phân tích tổng hợp Phương pháp so sánh đối chiếu HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Phương pháp thực nghiệm B GIẢI QUYẾT VẤN ĐỀ I Tư tưởng chia để trị (Divide and Conquer): Chia để trị tư tưởng phổ biến sống áp dụng hiệu Tin học Tư tưởng phương pháp chia để trị Người ta phân toán thành toán con, toán lại tiếp tục phân thành toán nhỏ hơn, tiếp tục ta nhận tốn có thuật giải dễ dàng đưa thuật giải Sau kết hợp nghiệm toán để nhận nghiệm toán lớn để cuối nhận nghiệm tốn cần giải Thơng thường toán phân chia dạng với tốn ban đầu có cỡ chúng nhỏ Thuật tốn chia để trị biểu diễn mơ hình đệ quy sau: Procedure DivideConquer(A,x); //Tìm nghiệm x toán A Begin If (A đủ nhỏ) then Solve(A) Else Begin Phân A thành toán A1, , Am; For i:=1 to m DivideConquer(Ai,xi); Kết hợp nghiệm xi toán Ai để nghiệm toán A; End; End; Chúng ta nghiên cứu toán Tháp Hà nội, tốn điển hình giải phương pháp chia để trị để thấy rõ tư tưởng phương pháp HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Ví dụ Bài tốn Tháp Hà Nội Có N đĩa có đường kính khác đặt chồng lên theo thứ tự giảm dần đường kính tính từ lên Có ba vị trí đặt đĩa đánh số 1, 2, Chồng đĩa ban đầu đặt vị trí 1: Cần chuyển chồng đĩa từ vị trí sang vị trí 2, theo quy tắc sau: • Khi di chuyển đĩa, phải đặt vào ba vị trí cho • Mỗi lần chuyển đĩa phải đĩa • Tại vị trí, đĩa chuyển đến phải đặt lên Đĩa lớn không phép đặt lên đĩa nhỏ (hay nói cách khác: đĩa đặt mặt đất đặt đĩa lớn hơn) Bài tốn có nguồn gốc truyền thuyết Ấn độ có nhóm cao tăng Ấn độ giáo giao trọng trách chuyển dần 64 đĩa vàng cọc kim cương theo điều kiện nói phần Khi hồn tất cơng việc, tức chuyển xong tồn 64 đĩa từ vị trí ban đầu sang vị trí kết thúc thời điểm tận Chúng ta giải toán cách chia tốn chuyển N đĩa, từ vị trí sang vị trí thành ba tốn đơn giản sau: Chuyển N-1 đĩa từ vị trí sang vị trí 3, dùng vị trí làm trung gian Chuyển đĩa thứ N từ vị trí sang vị trí Chuyển N-1 đĩa từ vị trí sang vị trí 2, dùng vị trí làm trung gian HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Chú ý toán tương tự tốn ban đầu, khác kích thước nhỏ Chúng giải phương pháp “chia để trị” giống toán ban đầu Dễ dàng kiểm tra giải chúng thoả mãn điều kiện Bài tốn giải đơn giản Thuật toán viết dạng giả mã sau: Procedure Hanoi; begin Move(n,1,2,3); end; Procedure Move(n,a,b,c); {chuyển n đĩa, từ vị trí a sang vị trí b, dùng vị trí c làm trung gian } begin if n=0 then exit; Move(n-1,a,c,b); writeln('Chuyển đĩa ',n, ' từ vị trí ',a, 'sang vi tri ',b); Move(n-1,c,b,a); end; Chương trình Pascal: Program ThapHN; var n:integer; procedure move(n,a,b,c:integer); begin if n=0 then exit; move(n-1,a,c,b); writeln('Chuyen dia ',n,' tu vi tri ',a,' sang vi tri ',b); HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM move(n-1,c,b,a); end; begin write('Nhap N = ');readln(n); move(n,1,2,3); readln end Chúng ta dừng lại chút để phân tích độ phức tạp tính tốn Gọi T(n) số thao tác chuyển đĩa cần thiết để chuyển xong n đĩa Theo thuật tốn ta có: T(n) = T(n-1) + + T(n-1) Bằng phương pháp giải công thức truy hồi ta có T(n) = n-1 Áp dụng kết với giả thiết cao tăng phải giây để chuyển xong đĩa từ cọc sang cọc kia, ta thấy thời gian để chuyển toàn 64 đĩa vàng T(64)=216-1=18446744073709551615 giây Như ngày tận (nếu có) theo truyền thuyết phải 600 tỉ năm đến HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM II Hiệu Chia để trị toán xếp tìm kiếm Bài tốn xếp Bài toán: Cho dãy A gồm N số nguyên Sắp xếp dãy A thành dãy khơng giảm Bài tốn xếp tốn quen thuộc có nhiều thuật tốn để giải toán Các thuật toán Sắp xếp bọt (Bubble Sort) hay chèn trực tiếp (Insertion Sort) có độ phức tạp cỡ O(n 2) Thuật tốn xếp nhanh (Quick Sort) hay xếp trộn (Merge Sort) hai thuật toán xếp theo tư tưởng chia để trị 0Với tư tưởng chia để trị, Quick Sort Merge Sort cho ta độ phức tạp nhỏ thường O(nlogn) Trong đề tài tập trung nghiên cứu thuật toán QuickSort Chúng ta xét thuật toán xếp nhanh (Quick Sort) Ý tưởng: Tư tưởng thuật toán chia để trị, ta tìm cách chia đơi dãy ban đầu cách chọn phần tử chốt (pivot) Từ dãy ban đầu, tất phần tử nhỏ phần tử chốt đưa bên trái dãy; phần tử lớn chốt đưa bên phải dãy Sau bước ta có phần tử chốt đứng vị trí Dãy ban đầu chia thành hai dãy nằm hai bên chốt Tiếp tục phân chia dãy theo cách tương tự dãy có độ dài Có thể chọn phần tử chốt nằm đầu, cuối, dãy chọn ngẫu nhiên phần tử dãy Giải Thuật: Trường hợp sau chọn chốt phần tử dãy Sắp xếp đoạn X[L] X[R] với điều kiện L n; 22 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM - Đưa max Chương trình: {$OBJECT FPC} const nmax=1000; Type mang=array[1 nmax] of integer; var a:mang; n,i:integer; procedure enter; var i:longint;f:text; begin assign(f,'TC.inp');reset(f); readln(f,n); for i:=1 to n readln(f,a[i]); close(f); end; procedure quicksort(l,h:integer); var i,j,key,tg:integer; begin i:=l; j:=h; key:=a[(l+h) div 2]; repeat while a[i]key dec(j); if ij; if j>l then quicksort(l,j); if i K dãy xếp nên việc tìm kiếm thực dãy từ A1 đến AGiữa-1 phạm vi tìm kiếm khoảng nửa phạm vi tìm kiếm trước - Nếu AGiữa < K thực tìm kiếm dãy từ AGiữa+1 đến AN Quá trình tìm kiếm kết thúc tìm thấy khóa K dãy A phạm vi tìm kiếm rỗng Thuật toán: Bước 1: Nhập N số hạng A1 AN khóa K; Bước 2: First=1; Last=N; Bước 3: Mid=[(First+Last)/2]; Bước 4: Nếu AMid=K thơng báo số Mid kết thúc; Bước 5: Nếu AMid>K Last=Mid-1, chuyển đến bước 7; Bước 6: First=Mid+1; Bước 7: Nếu First>Last thơng báo dãy A khơng có số hạng K kết thúc; Bước 8: Quay lại bước 25 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Thuật tốn tìm kiếm nhị phân có tư tưởng gần giống với thuật tốn xếp nhanh Nó thực việc tìm vị trí trung tâm, thông qua phép so sánh giá trị cần tìm với giá trị vị trí trung tâm để định vùng liệu (trước hay sau vị trí trung tâm) mà giá trị thuộc Việc tìm kiếm tiếp tục 1/2 tập hợp liệu vừa xác định với cách thức tìm kiếm, giá trị vị trí trung tâm giá trị cần tìm phạm vi tìm kiếm rỗng dừng Vì sau bước tìm kiếm miền liệu lại giảm phân nữa, số lượng bước tìm kiếm tăng dần tới tối đa log2(N) Vì độ phức tạp thuật toán xem O(logN) Chúng ta xem cách cài đặt thuật tốn thơng qua ví dụ sau: Bài toán áp dụng: Bài Cho dãy gồm N số nguyên dương, xác định xem có tồn hay khơng dãy liên tiếp có tổng K hay khơng? Với tốn ta thực cách duyệt tất dãy có từ dãy N phần tử thực tính tổng dãy so sánh với K Giải thuật thực sau: For i:=1 to N Begin S:=0; For j:=i to N S:=S+A[j]; If s=k then begin write(‘tim thay’);break; end; End; Thuật toán cho ta độ phức tạp cỡ O(n 2) Ta cải tiến thuật tốn nhận cách sau: - Tạo dãy S Si=A1+ +Ai; - Nhận thấy dãy A gồm số nguyên dương nên dãy S tăng dần - Để xác định đoạn [Ai,Aj] có tổng phần tử K hay khơng ta thực tìm kiếm nhị phân đoạn từ vị trí i đến vị trí j dãy S mà Sj-Si=K 26 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Giải thuật sau: Bước Tạo dãy S từ dãy A: S[0]:=0; Với i nhận giá trị từ đến n làm S[i]:=S[i-1]+A[i]; Bước Res=-1; {Res dùng để đánh dấu vị trí cuối dãy cần tìm} Bước Với i nhận giá trị từ đến N làm: 3.1 Cho first:=i; last:=n; 3.2 chừng firstk last:=mid-1; first:=mid+1; 3.3 Nếu Res-1 đưa dãy cần tìm dãy A i+1 đến ARes Và kết thúc Bước Đưa kết luận khơng tìm thấy kết thúc Chương trình: {$OBJECT FPC} const nmax=100000; var n,k:longint; a:array[1 nmax]of longint; s:array[0 nmax]of longint; procedure enter; var i:longint; begin write('n= '); readln(n); write('k= '); readln(k); fillchar(s,sizeof(s),0); for i:=1 to n begin write('a[',i,']= '); readln(a[i]); s[i]:=s[i-1]+a[i]; end; 27 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM end; procedure main; var first,mid,last,i,res,id:longint; begin res:=-1; for i:=0 to n-1 begin first:=i; last:=n; while firstk then last:=mid-1 else first:=mid+1; end; if res-1 then begin write('day la: ',i+1,' ',res); break; end; end; end; BEGIN enter; main; readln END Đánh giá độ phức tạp thuật toán: Ta thấy thời gian thực thuật toán tổng thời gian thực chương trình Enter (cỡ O(n)) chương trình main; Do việc tìm số res thực nửa dãy A i đến An (với i= đến n) nên chương trình main có độ phức tạp cỡ O(nlogn) Vậy thuật toán giải toán có độ phức tạp cỡ O(nlogn) Thuật tốn cịn cải tiến để có độ phức tạp cỡ O(n) xem xét vấn đề chuyên đề khác Nhưng với tư tưởng chia để trị thuật tốn tìm kiếm nhị phân thấy độ phức tạp thuật toán cải thiện 28 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM phần Bài tốn tìm kiếm nhị phân có đầu vào dãy xếp nên số tập có kế thừa từ thuật tốn xếp Trong lập trình ta gặp toán cần thực thao tác chèn xóa phần tử khơng thõa mãn khỏi dãy cho Chúng ta tìm hiểu kỹ thuật chèn phần tử vào dãy xóa phần tử khỏi dãy qua tập sau: Bài 2: Cho dãy A gồm N số nguyên a 1, ,an xếp theo thứ tự không giảm khóa K Hãy chèn khóa K vào dãy A cho dãy đảm bảo thứ tự khơng giảm Ý tưởng: Ta cần xác định vị trí vt để chèn khóa K Thực tìm kiếm nhị phân dãy A để tìm vị trí vt thõa mãn a vtK Đẩy phần tử từ vt đến n lùi xuống vị trí Đặt a vt=K Tăng n lên đơn vị Chương trình {$OBJECT FPC} program chen; const nmax=100001; var a:array[1 nmax]of longint; n,k,vt,i:longint; procedure enter; var i:longint; begin write('n,k '); readln(n,k); //nhap day tang dan for i:=1 to n begin write('a[',i,']= '); readln(a[i]); end; end; procedure main; var first,mid,last,i:longint; begin first:=1; 29 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM last:=n; if Ka[n] then vt:=n+1 else while firsttrunc(sqrt(x))); end; procedure main; var first,mid,last,vt,i:longint; begin first:=1; last:=j; while firstK then first:=mid+1 else last:=mid-1; end; for i:=vt to j a[i]:=a[i+1]; dec(j); end; begin write('nhap n,k: ');readln(n,k); j:=0; for i:=1 to n if nt(i) then begin inc(j);a[j]:=i;end; Writeln('Day so nguyen to la: '); For i:=1 to j write(a[i],' '); writeln; main; writeln(vt); Writeln('Day nguyen to sau xoa ',K,' la: '); For i:=1 to j write(A[i],' '); readln end 32 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM C KẾT LUẬN VÀ KIẾN NGHỊ Qua phần thấy phần hiệu phương pháp chia để trị Chúng ta thấy tính thuật tốn thể hiện: Chia để trị sử dụng kĩ thuật đệ quy, thông thường đệ quy nhiều nhánh; Tính thuật tốn Chia để trị chứng minh giải thuật đệ quy (sử dụng quy nạp) sử dụng bất biến vòng lặp Trong giới hạn đề tài không đề cập vấn đề Một số vấn đề cần lưu ý sử dụng phương pháp Chia để trị là: - Lời gọi đệ qui nhiều tốn, nhiều lần dẫn tới tượng tràn vùng nhớ đệm - Cần có chiến lược phân rã hợp lý miền liệu để đảm bảo thuật giải tốt - Hạn chế thường gặp thuật toán Chia để trị: Việc phân rã dẫn tới số tốn trùng Sắp xếp tìm kiếm hai toán thường gặp, toán có nhiều phương pháp giải khác Khơng thể thơng qua số ví dụ cụ thể mà đánh giá thuật toán tốt thuật toán mặt Việc chọn thuật tốn thích hợp cho phù hợp với yêu cầu, điều kiện cụ thể kỹ người lập trình QuickSort MergeSort thuật tốn xếp tổng qt, dãy khóa thuộc kiểu liệu có thứ tự áp dụng không thiết phải số Tuy phương pháp có số trường hợp suy biến nhiên điểm nhỏ so với ưu điểm chung chúng nhanh Tìm kiếm nhị phân thực dãy xếp Nhưng điều kiện đầu vào thõa mãn biến đổi đầu vào cách hợp lý việc tìm kiếm thực nhanh 33 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Những thuật tốn khơng đơn cho ta tìm hiểu thêm cách giải toán, mà cách cài đặt chúng cho ta thêm nhiều kinh nghiệm kỹ thuật lập trình như: Chèn, xóa phần tử dãy; "Chia để trị" hiệu số tốn cụ thể Trong q trình giảng dạy thân tơi nhận thấy việc tự nghiên cứu công việc quan trọng Thực đề tài làm sáng kiến kinh nghiệm hội học tập tốt cho thân.Trong trình thực thực nghiệm giúp thân nhận nhiều kiến thức, kinh nghiệm phục vụ qúa trình giảng dạy học tập Trong đề tài tơi cố gắng đưa số dạng tập thường gặp sử dụng thuật toán xếp tìm kiếm theo tư tưởng chia để trị mong giúp ích cho giáo viên học sinh trình giảng dạy học tập Do thời gian có hạn nên nội dung đề tài chắn cịn nhiều thiếu sót, mong nhận phản hồi góp ý từ đồng nghiệp để hồn thiện áp dụng đề tài vào giảng dạy 34 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM TÀI KIỆU THAM KHẢO Tài liệu giáo khoa chuyên tin – Tác giả Hồ Sĩ Đàm (Chủ biên) – Đỗ Đức Đơng – Lê Minh Hồng – Nguyễn Thanh Tùng Nhà xuất Giáo dục Việt Nam 2009 Giải thuật lập trình Tác giả Lê Minh Hoàng Nhà xuất Đại học Sư phạm Hà Nội 2002 Đề thi Học sinh giỏi tỉnh, Đề thi chọn dự tuyển Quốc gia số tỉnh 35 ... readln end 32 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM C KẾT LUẬN VÀ KIẾN NGHỊ Qua phần thấy phần hiệu phương pháp chia để trị Chúng ta thấy tính thuật tốn thể hiện: Chia để trị sử dụng... a[i]a[i+1] then inc(d); 23 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM end; Begin assign(f,'TC.out');rewrite(f); write(f,d); close(f); enter; main; end 24 HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP... từ phổ biến đến khó áp dụng phương pháp phân tích tính hiệu tốn Vì tơi chọn đề tài: ? ?Hiệu chia để trị xếp tìm kiếm” HIỆU QUẢ CỦA CHIA ĐỂ TRỊ TRONG SẮP XẾP VÀ TÌM KIẾM Mục đích nghiên cứu Trong

Ngày đăng: 17/11/2020, 14:24

Từ khóa liên quan

Mục lục

  • A. ĐẶT VẤN ĐỀ

    • 1. Lý do chän ®Ò tµi:

    • 1. Bài toán sắp xếp

    • C. KẾT LUẬN VÀ KIẾN NGHỊ

    • TÀI KIỆU THAM KHẢO

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

Tài liệu liên quan