1. Trang chủ
  2. » Luận Văn - Báo Cáo

123Doc tai lieu chat nhi phan cho boi duong hsg tin hoc

28 12 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 55,62 KB

Nội dung

I ĐẶT VẤN ĐỀ > Từ năm 2006 đến với việc đoi cách đề kỳ thi IOI kỳ thi học sinh giỏi mơn Tin học có cách tiếp cận Những năm trước đề thi thường tập trung vào thuật toán phức tạp, nhiều học sinh phải thuộc lịng thuật tốn áp dụng cách máy móc Hiện đề thi ln u cầu học sinh vận dụng thuật toán cách linh hoạt, 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 “nhanh” đáp ứng yêu cầu thời gian Việc bồi dưỡng học sinh giỏi môn Tin học phần lớn tập trung mức độ tìm thuật tốn cho tốn Ví dụ: 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 ta có thuật tốn xếp tráo đổi (thuật tốn xếp“nổi bọt”) có độ phức tạp O(N 2) Đây thuật toán khả thi trường hợp N < 10 3, 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 tốn từ O(K) xuống cịn O(logK) lý tác giả chọn đề tài > > Trong q trình giảng dạy tơi thường chia kỹ thuật thành hai dạng: • Chặt nhị phân theo kết • Chặt nhị phân dãy số Nội dung đề tài thể hai kỹ thuật thông qua ví dụ cụ thể, với kỹ thuật trình bày theo cấu trúc: • Xét tốn điển hình • Giải tốn • Bài tập áp dụng II NỘI DUNG J CƠ SỞ LÝ LUẬN > Bản chất kỹ thuật “chặt nhị phân” thuật tốn tìm kiếm nhị phân Thuật tốn học sinh 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 lại lần đưa vào giảng dạy điều cho thấy tầm quan trọng thuật tốn tìm kiếm nhị phân > Trước trình kỹ thuật “chặt nhị phân” ta tìm hiểu 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), cịn có thuật tốn tìm kiếm nhị phân có độ phức tạp O(logN) với ý tưởng sau: • 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 tốn • Nếu Agiua >k việc tìm kiếm xét dãy a1,a2 ,aglua_i • Nếu Agiua 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(«í) ) Theo đề n < 105 Uị < 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 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 nàylặ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 Tư tưởng giảm chi phí xét khả x thuật tốn hồn tồn giống với q trình tìm khóa thuật tốn tìm kiếm nhị phân > Các toán áp dụng kỹ thuật chặt nhị phân theo kết thường có yêu cầu tìm giá trị nhỏ lớn Tùy vào yêu cầu mà ta có cấu trúc đoạn chương trình chặt nhị phân khác ❖ Trường hợp tìm giá trị lớn nhất: Dau:=a-1; cuoi:=b+1; While ( dauM then exit(false); s:=a[i]; end; Check: =true; End; Đoạn chương trình chặt nhị phân trường hợp tìm giá trị nhỏ Procedure solve; Var Dau,Cuoi,Giua:longint; Begin Res:=dmax+1; {Chat nhi phan ket qua} Dau:=dmin-1; Cuoi:=sum+1; while (dau L[jmax]) then jmax:= j; L[i] := L[j max ] + 1; end; Writeln('Do dai day tang la : L[n+1] - 2); end; • Kết tốn L[n+1]-2 • Độ phức tạp thuật toán O(N2) Theo đề N < 10 nên thuật tốn chưa đáp ứng yêu cầu Ta cần giảm độ phức tạp thuật toán o Xét i phần tử (a0, a1, ,ai-1) Với độ dài k, tìm cách lưu trữ thơng tin dãy tăng độ dài k, gọi CS[k] lưu số x phần tử a thỏa mãn: x • Dãy tăng dài kết thúc a có độ dài k • Phần tử kết thúc a nhỏ (khả nối thêm cao nhất) • Một cách dễ hiểu CS[k] số số hạng nhỏ số hạng x x cuối dãy tăng có độ dài k Đương nhiên CS[1] < CS[2] < < CS[k] • Nhận xét: Nếu m độ dài dãy tăng dài nhất: a [1] cs A[CS[Res]] then Begin Inc(Res); CS[Res]:=i; End else Begin //Chặt nhị phân cập nhật lại mảng CS Dau:=1; Cuoi:=Res; While Dau A[j] then Dau:=Giua+1 else Cuoi:=Giua; End; CS[Dau]:=i; End; End; // Res biến lưu độ dài dãy tăng dài ❖ Trường hợp tìm dãy giảm: Res:=1; CS[1]:=1; For i:=2 to n Begin If A[i] > A[CS[1]] then CS[1]:=i else if A[i] < A[CS[Res]] then Begin Inc(Res); CS[Res]:=i; End else Begin //Chặt nhị phân cập nhật lại mảng CS Dau:=1; Cuoi:=Res; While Dau y.b)); End; // Sắp xếp theo chiều giảm số đầu a Procedure QuickSort(l, r : longint); Var i, j : longint; x : doan; Begin If l >= r then exit; i := l; j := r; x := T[l + random(r - l + 1)]; Repeat While x < T[i] inc(i); While T[j] < x dec(j) ; If i j; QuickSort(l, j); QuickSort(i, r); End; Bước 2: Chặt nhị phân tìm độ dài dãy không giảm dài theo số B Procedure Solve; Var CS : array[1 maxn] of longint; res,dau,cuoi,giua, i : longint; Begin res := 1; CS[res] : = 1; For i := to n If T[i].b < T[CS[1]].b then CS[1] := i Else If T[i].b >= T[CS[res]].b then Begin inc(res); CS[res] := i End Else Begin dau := 1; cuoi := res; While dau < cuoi Begin giua := (dau + cuoi) div 2; If T[i].b >= T[CS[giua]].b then dau := giua + else cuoi := giua; End; CS[dau] := i; End; writeln(res); End; Bài tốn ta cịn thuật tốn khác cài đặt số nhị phân BIT để tìm độ dài dãy con, độ phức tạp thuật toán O(NlogN)

Ngày đăng: 28/07/2023, 22:36

w