(TIỂU LUẬN) 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

42 5 0
(TIỂU LUẬN) 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

Đ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

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 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ố Kết luận Tài liệu tham khảo 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 toán, tập trung mức độ tìm thuật tốn cho tố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(N ) Đây thuật toán trường hợp N≤ 10 Nếu tăng số lượng phần tử lên khoảng 10 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 tốn từ O(K) xuống cịn O(logK) Chun đề: 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 tố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 tố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 Agiua “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 tố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 END //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; Dựa vào ý tưởng thuật tố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ố tố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 ≤ 10 ) Đoạn dây thứ i có độ dài (0 < ≤ 10 ) 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 11 802 743 547 539 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 toá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 ≤ 10 ≤ 10 , 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 toá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 tốn nằm đoạn [dau x-1], q 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 (dauk Nếu số nhóm = k khỏi cần làm cho mệt Số nhóm < k bó tay Lưu ý : Nếu hàm kiểm tra trả giá trị true lưu giá trị sức mạnh thời lại xét đoạn có giá trị sức mạnh lớn xem có cịn giá trị sức mạnh lớn thỏa mãn hay không Nếu hàm kiểm tra trả giá trị false ta buộc lịng phải xét khoảng có giá trị sức mạnh nhỏ * Chương trình tham khảo: program YUGI; const maxN =200; maxV =32767; var n,k :Byte; A :Array[1 maxN,1 maxN] of SmallInt; Free :Array[1 maxN] of Boolean; 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 28 3 Tài liệu bồi dưỡng HSG môn Tin học ans :SmallInt; procedure Enter; var i,j :Byte; begin read(n,k); for i:=1 to n for j:=1 to n Read(A[i,j]); end; procedure DFSVisit(u :Byte; m :SmallInt); var v :Byte; begin Free[u]:=false; for v:=1 to n if (A[u,v]=k); end; procedure BS; var left,right,mid :SmallInt; begin ans:=0; left:=0; right:=maxV; while (left nRobots then Inc(nRobots); end; end; //nRobots: số lượng rôbốt cần sử dụng Bài 7: SỐ LƯỢNG DÃY CON TĂNG Cho dãy số a1,a2, ,an Hãy đếm số lượng dãy tăng dài dãy số Một dãy độ dài k dãy a xác định số (u1≤u2≤u3≤ ≤uk) (1≤ui≤n) Hai dãy (u1,u2,u3, ,uk) (v1,v2,v3, ,vt) gọi khác k≠t tồn vị trí i cho ui≠vi Dữ liệu: Vào từ file văn DEM.INP + Dòng ghi số nguyên dương n (n≤10 ) 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 35 Tài liệu bồi dưỡng HSG mơn Tin học + Dịng ghi n số nguyên mô tả dãy a (ai≤10 ) Kết : Ghi file văn DEM.OUT Một dòng ghi kết theo module 1000000007 Ví dụ Gợi ý: Khai báo mảng A, phần tử ghi gồm trường: L, ID, Val Trong trường Val lưu giá trị dãy số, ID lưu số thứ tự ban đầu, L lưu độ dài dãy tăng dài kết thúc A[i].val Bài phải thực chặt nhị phân lần Lần 1: Chặt nhị phân để xây dựng giá trị cho trường L Res:=1; cs[1]:=1; a[1].l:=1; For i:=2 to n Begin If a[i].vala[cs[res]].val then Begin Inc(Res); cs[Res]:=i; a[i].l:=Res; End Else Begin Dau:=1; Cuoi:=Res; While Daua[cs[Giua]].val then Dau:=Giua+1 else Cuoi:=Giua; End; cs[Dau]:=i; a[i].l:=Dau; End; End; Sắp xếp dãy A theo trường L, L xếp theo vị trí mảng A ban đầu Sau xếp xong, với đoạn có L vị trí tăng dần hiển nhiên giá trị val giảm dần Gọi F[i] số lượng dãy tăng có độ dài lớn tính đến a[i] Với a[i] ta cần tìm a[j] có a[j].L=a[i].L-1 thỏa mãn a[j].val

Ngày đăng: 07/12/2022, 09:50

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

Tài liệu liên quan