Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
1,12 MB
Nội dung
Tài liệu bồi dưỡng HSG môn Tin học SỞ GD&ĐT BẠC LIÊU TRƯỜNG THPT CHUYÊN BẠC LIÊU Chuyên đề bồi dưỡng HSG môn Tin học: ỨNG DỤNG KỸ THUẬT CHẶT NHỊ PHÂN TRONG VIỆC GIẢI CÁC BÀI TOÁN TIN HỌC GV Biên soạn : NGUYỄN CHÁNH TÍN Đơn vị: Trường THPT Chuyên Bạc Liêu Tháng 02/2018 Chuyên đề: Kỹ thuật Chặt nhị phân – Nguyễn Chánh Tín – trường THPT Chuyên Bạc Liêu Tài liệu bồi dưỡng HSG môn Tin học MỤC LỤC Mục Nội dung Trang Lời mở đầu Phần nội dung I- Cơ sở lý thuyết II- Chặt nhị phân theo kết III- Chặt nhị phân dãy số 19 Kết luận 37 Tài liệu tham khảo 38 Chuyên đề: Kỹ thuật Chặt nhị phân – Nguyễn Chánh Tín – trường THPT Chuyên Bạc Liêu Tài liệu bồi dưỡng HSG môn Tin học LỜI MỞ ĐẦU Hiện kỳ thi, đề thi yêu cầu vận dụng phối hợp nhiều thuật toán cách linh hoạt để giải toán Với tốn học sinh khơng phải đưa thuật tốn mà thuật tốn cịn phải tốt đáp ứng yêu cầu thời gian để “ăn” hết test lớn Phần lớn giải tốn, tập trung mức độ tìm thuật toán cho toán Chẳng hạn với toán sau: Cho dãy số nguyên gồm N phần tử, xếp để dãy số cho trở thành dãy không giảm? Trước tiên nghĩ đến thuật toán xếp tráo đổi (thuật tốn xếp “nổi bọt”) có độ phức tạp O(N2) Đây thuật toán trường hợp N≤ 103 Nếu tăng số lượng phần tử lên khoảng 105 phần tử ta cần thuật tốn xếp tốt như: QuickSort, MergeSort có độ phức tạp O(NlogN) Từ vấn đề thực tiễn kỹ thuật “Chặt nhị phân” kỹ thuật giúp làm giảm thời gian thực thuật toán từ O(K) xuống O(logK) Chuyên đề: Kỹ thuật Chặt nhị phân – Nguyễn Chánh Tín – trường THPT Chuyên Bạc Liêu Tài liệu bồi dưỡng HSG môn Tin học PHẦN NỘI DUNG I- Cơ sở lý thuyết: Bản chất kỹ thuật “Chặt nhị phân” dựa ý tưởng thuật tốn tìm kiếm nhị phân Thuật tốn tìm kiếm nhị phân học chương trình lớp 10 THPT (trang 42 – SGK Tin học 10), chương trình Tin học lớp 11 thiết kế cài đặt chương trình pascal Trước trình bày kỹ thuật “Chặt nhị phân” ta tìm hiểu lại tốn sau đây: Bài toán: Cho dãy A dãy tăng gồm N số nguyên khác a1, a2 ,an số nguyên K Hỏi dãy A có phần tử có giá trị K khơng?(SGK – Tin học 10) Để giải tốn ngồi thuật tốn tìm kiếm có độ phức tạp O(N), thuật tốn tìm kiếm nhị phân có độ phức tạp O(logN): 1) Giới thiệu: Trong khoa học máy tính, thuật tốn tìm kiếm nhị phân thuật tốn dùng để tìm kiếm phần tử danh sách xếp Thuật toán hoạt động sau Trong bước, so sánh phần tử cần tìm với phần tử nằm danh sách Nếu hai phần tử phép tìm kiếm thành cơng thuật tốn kết thúc Nếu chúng khơng tùy vào phần tử lớn hơn, thuật toán lặp lại bước so sánh với nửa đầu nửa sau danh sách Vì số lượng phần tử danh sách cần xem xét giảm nửa sau bước, nên thời gian thực thi thuật toán hàm lơgarit Thuật tốn tìm kiếm nhị phân dùng để tìm kiếm phần tử danh sách xếp, ví dụ danh bạ điện thoại xếp theo tên, tìm kiếm số điện thoại người theo tên người Thuật tốn tìm kiếm nhị phân chạy nhanh tìm kiếm có số nhược điểm Tìm kiếm nhị phân chậm bảng băm Nếu nội dung danh sách bị thay đổi danh sách phải xếp lại trước sử dụng tìm kiếm nhị phân Thao tác thường tốn nhiều thời gian 2) Ý tưởng thuật tốn: Vì dãy A dãy tăng nên ta tìm cách thu hẹp phạm vi tìm kiếm sau lần so sánh khóa với số hạng chọn Để làm điều đó, ta chọn số hạng A giua “giữa dãy” để so sánh với k, Giua =[(N+1)/2] Khi xảy ba trường hợp: Nếu Agiua=k giua là phần tử cần tìm, thơng báo có phần tử K kết thúc thuật toán Nếu Agiua>k việc tìm kiếm xét dãy a1,a2 ,agiua-1 Nếu Agiua a[mid]) return BinarySearch(a,mid+1,right,x); } Sau phép so sánh, số lượng phần tử danh sách cần xét giảm nửa Thuật toán kết thúc số lượng phần tử cịn khơng q Vì thời gian thực thi thuật tốn O(logn) * Chương trình sau tạo ngẫu nhiên mảng data, xếp tăng dần thuật toán Quicksort nhập vào giá trị tìm k, dùng thuật tốn tìm kiếm nhị phân BS để thực tìm kiếm: const max = 1000000; type tlist = array[1 max] of longint; var data : tlist; f:text; tim,k, i,N : longint; procedure qsort(var a : tlist); procedure sort(l,r: longint); var i,j,x,y: longint; begin i:=l; j:=r; x:=a[(l+r) div 2]; repeat while a[i]j; if lcuoi; exit(0); end; BEGIN //tao ngau nhien mang data randomize; write('Nhap N: '); readln(N); for i:=1 to N data[i]:=random(1000); //sap xep qsort(data); //ghi file assign(f,'SO.INP'); rewrite(f); for i:=1 to N writeln(f,data[i]); close(f); //Tim kiem nhi phan write('Nhap k: '); readln(k); tim:=BS(k); if tim=0 then writeln('Khong tim thay') else writeln('Tim thay tai vi tri : ', tim); readln; END Dựa vào ý tưởng thuật toán tìm kiếm nhị phân xây dựng kỹ thuật “Chặt nhị phân” áp dụng kỹ thuật giải số toán Kỹ thuật Chặt nhị phân chia thành hai dạng: Chặt nhị phân dựa theo kết Chặt nhị phân dãy số Chuyên đề: Kỹ thuật Chặt nhị phân – Nguyễn Chánh Tín – trường THPT Chuyên Bạc Liêu Tài liệu bồi dưỡng HSG môn Tin học II- Chặt nhị phân dựa theo kết quả: 1) Xét toán Cho n đoạn dây điện (1 ≤ n ≤ 105) Đoạn dây thứ i có độ dài (0 < ≤ 109) Cần phải cắt đoạn cho thành đoạn cho có K đoạn dây có độ dài ngun Có thể khơng cần cắt hết đoạn dây cho Mỗi đoạn dây bị cắt có phần cịn thừa khác Yêu cầu: Xác định độ dài lớn đoạn dây nhận Nếu khơng có cách cắt đưa số Dữ liệu: file văn WIRES.INP có cấu trúc: + Dịng chứa hai số nguyên N, K + Dòng thứ i N dòng chứa số nguyên Kết quả: Đưa file văn WIRES.OUT, Một dòng ghi độ dài lớn nhận INPUT OUTPUT 11 802 743 547 539 200 2) Giải toán Ta dùng mảng A lưu độ dài đoạn dây, biến Res lưu kết toán, biến sum tổng độ dài N đoạn dây Bài tốn giải giải thuật sau: ta thử độ dài x (x nhận giá trị từ tới (sum div k)), sau kiểm tra xem có cắt K đoạn có độ dài x khơng? Hàm kiểm tra xem có cắt K đoạn có độ dài x sau: Function Check(x: Longint): Boolean; Var i,count:longint; Begin Count:=0; For i:=1 to n Count:= Count + A[i] div x; Check:=(Count>=K); End; Đoạn chương trình xét giá trị x sau: Res:=0;// Res biến lưu kết toán For x:=1 to (sum div k) If Check(x) then Res:=x; Ta thấy hàm Check(x) có độ phức tạp O(n), đoạn chương trình xét giá trị x có độ phức tạp O(nL) với L=min(sum div k, max(ai) ) Theo đề n ≤ 105 ≤ 109, giải thuật giải toán với liệu nhỏ Để giải trọn vẹn toán ta cần giảm độ phức tạp thuật tốn Chi phí hàm Chuyên đề: Kỹ thuật Chặt nhị phân – Nguyễn Chánh Tín – trường THPT Chuyên Bạc Liêu Tài liệu bồi dưỡng HSG môn Tin học Check(x) phụ thuộc vào N, ta giảm số phép thử x sau: Giả sử phạm vi giá trị [dau cuoi], xét giá trị x:=(dau+cuoi) div 2, Check(x) = true kết toán x nằm đoạn [x+1 cuoi], ngược lại kết toán nằm đoạn [dau x-1], trình lặp lặp lại dau>=cuoi dừng Đoạn chương trình xét giá trị x viết lại sau: Res:=0; Dau:=0; cuoi:=sum div k+1; While (dau