Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
78,38 KB
Nội dung
MỤC LỤC Trang MỞ ĐẦU SỞ GIÁO DỤC ĐÀO TẠO THANH HĨA TRƯỜNG THPT HOẰNG HĨA 1.1 Lí chọn đề tài 1.2 Mục đích nghiên cứu .1 1.3 Đối tượng nghiên cứu 1.4 Phương pháp nghiên cứu 2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lí luận sáng kiến kinh nghiệm 2.1.1 Thuật tốn tìm kiếm nhị phân SÁNG KIẾN KINH NGHIỆM 2.1.2 Khái niệm hàm lower_bound(), upper_bound có sẵn TÊN ĐỀ TÀI C++ hệ hàm…………………………………… CHUYÊN ĐỀ TÌM KIẾM NHỊ PHÂN VÀ ỨNG DỤNG CÁC 2.1.3 Thuật toán chặt nhị phân theo kết ……………………… HÀM LOWER_BOUND (), UPPER_BOUND () TRONG BỒI 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm …… DƯỠNG HỌC SINH GIỎI TIN HỌC 11 2.3 Các sáng kiến kinh nghiệm giải pháp sử dụng để giải vấn đề …………………………………………………….10 2.3.1 Hướng dẫn học sinh số tập sử dụng thuật toán tìm kiếm Người thực : Trương Thị Quý Nhị phân sử dụng hàm lower_bound(), upper_bound C++ Chức vụ: ….10 Giáo viên 2.3.2 Hướng dẫn học sinh mộtlĩnh số sử dụng SKKN thuộc vựctập : Tin học thuật toán chặt nhị phân theo kết quả……………………………………………………… 14 2.4 Hiệu sáng kiến kinh nghiệm hoạt động giáo dục, với thân, đồng nghiệp nhà trường 19 KẾT LUẬN, KIẾN NGHỊ 3.1 Kết luận 20 3.2 Kiến nghị .20 MỤC LỤC Trang MỞ ĐẦU 1.1 THANH HÓA, NĂM 2022 Lí chọn đề tài 1.2 Mục đích nghiên cứu .1 1.3 Đối tượng nghiên cứu 1.4 Phương pháp nghiên cứu 2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lí luận sáng kiến kinh nghiệm 2.1.1 Thuật tốn tìm kiếm nhị phân 2.1.2 Khái niệm hàm lower_bound(), upper_bound có sẵn C++ hệ hàm………………………………… 2.1.3 Thuật toán chặt nhị phân theo kết ……………………… 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm …… 2.3 Các sáng kiến kinh nghiệm giải pháp sử dụng để giải vấn đề…………………………………………………………….10 2.3.1 Hướng dẫn học sinh số tập sử dụng thuật toán tìm kiếm nhị phân sử dụng hàm lower_bound(), upper_bound C++ ……………………………………………………………………10 2.3.2 Hướng dẫn học sinh số tập sử dụng thuật toán chặt nhị phân theo kết quả………………………………………………………14 2.4 Hiệu sáng kiến kinh nghiệm hoạt động giáo dục, với thân, đồng nghiệp nhà trường…………………………………… 20 KẾT LUẬN, KIẾN NGHỊ 3.1 Kết luận .20 3.2 Kiến nghị 21 2 MỞ ĐẦU 1.1 Lí chọn đề tài Chương trình tin học lớp 11 nội dung tương đối khó với đa số học sinh Các em làm quen với thuật ngữ ngôn ngữ lập trình, loại cấu trúc liệu, ứng dụng ngơn ngữ lập trình để giải tốn thực tế sống Bên cạnh chương trinh Tin học lớp 11 chương trình thi học sinh giỏi môn Tin THPT, với tập với độ phức tạp cao sử dụng thuật tốn tìm kiếm thơng thường dẫn tới chương trình chạy q thời gian khơng lấy hết điểm với test liệu cao Và để khắc phục vấn đề cho học sinh tìm hiểu thuật tốn tìm kiếm nhị phân, hàm ứng dụng tìm kiếm nhị phân có sẵn C++, thuật toán chặt nhị phân theo kết để giải tập, đem lại hứng thú học tập cho học sinh, đặc biệt với đối tượng học sinh khá, giỏi Trong trình giảng dạy nhiều năm, tơi nhận thấy số tốn lập trình liên quan cơng việc tìm kiếm hay đưa kết tốn áp dụng thuật toán trên, đồng thời rèn luyện kĩ lập trình khả tư cho học sinh Do đó, tơi mạnh dạn đề xuất sáng kiến kinh nghiệm : “ Chuyên đề tìm kiếm nhị phân ứng dụng hàm lower_bound (), upper_bound () bồi dưỡng học sinh giỏi tin học 11” 1.2 Mục đích nghiên cứu - Nghiên cứu tốn có liệu lớn mà sử dụng phương pháp tìm kiếm khơng xét hết tất trường hợp toán - Ứng dụng ngơn ngữ lập trình C++ vào tốn cụ thể để giải vấn đề - Giúp học sinh giải tập chương trình có cấu trúc để giải tốn máy tính 1.3 Đối tượng nghiên cứu - Thuật tốn tìm kiếm nhị phân - Sử dụng hàm lower_bound(), upper_bound() có sẵn C++ để giải toán - Thuật toán chặt nhị phân theo kết - Một số toán cụ thể thực tế có áp dụng thuật tốn 3 - Tìm hiểu khả vận dụng đối tượng học sinh lớp dạy lập trình tốn để có phương pháp giảng dạy phù hợp 1.4 Phương pháp nghiên cứu - Tìm hiểu thuật tốn tìm kiếm nhị phân - Tìm hiểu thuật tốn chặt nhị phân theo kết - Tìm hiểu hàm lower_bound(), upper_bound có sẵn C++ - Chọn lọc số tập điển hình liên quan tới tìm kiếm chặt nhị phân theo kết để minh họa, hướng dẫn học sinh luyện tập thực hành - Thu thập thông tin kết học tập khả lập trình số tốn số lớp giảng dạy để có so sánh, đối chiếu thực nghiệm kết thực đề tài - Tham khảo số tư liệu internet tài liệu đồng nghiệp NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lí luận sáng kiến kinh nghiệm 2.1.1 Thuật tốn tìm kiếm nhị phân: 2.1.1.1 Xét ví dụ : Cho dãy số nguyên a1, a2, a3, , an số ngun X Tìm vị trí X dãy, dãy khơng có X thơng báo -1 Nếu ta dùng thuật tốn tìm kiếm độ phức tạp tốn O(n) Dùng tìm kiếm nhị phân để giảm độ phức tạp thuật toán xuống O(log n) Ý tưởng : - b1 : Sắp xếp dãy tăng dần - b2 : Sử dụng biến : + d : số đầu dãy + c : số cuối dãy + g = (d+c)/2 : số dãy - b3: Thực cơng việc so sánh : + Nếu a[g]=X ta có kết ans= g : Đưa kết ans=g kết thúc toán + Nếu a[g]>X : X thuộc đoạn bên trái a[g] thực tìm X, lúc vị trí c thay đổi c=g-1 + Nếu vị trí a[g]> X : X nằm đoạn bên phải a[g] thực tìm kiếm X, lúc vị trí d thay đổi d=g+1 Công việc so sánh gán giá trị d, c, g lặp lặp lại d>c dừng đưa kết khơng tìm thấy X dãy hay in kết -1 4 Thuật toán : int tknp (int d, int c, int x) {while (d n >> x; for (int i=1; i> a[i]; sort(a+1, a+n+1); 5 cout =X Nếu dãy khơng có k thơng báo -1 Ý tưởng : - Sắp xếp dãy a tăng dần d=1, c = n, g=(d+c)/2 Nếu a[g] >= X : { kq = g ; c = g-1 ; } Nếu a[g] c dừng đưa kết kq Thuật toán : int tknp1 (int d, int c, int x) { if (x>a[n] return -1 ; int kq ; while (d = x) { kq= g ; c =g - ; } else d = g +1; }return kq; } Code tham khảo : #include #define N int(1e5) using namespace std; int a[N+3]; int n,x; int tknp1(int d, int c, int x) { if (x > a[n]) return -1; int kq; while (d = x) { kq = g; c = g - 1; } else d = g + 1; } return kq; } int main() { freopen("tknp1.inp","r",stdin); freopen("tknp1.out","w",stdout); cin >> n >> x; for (int i=1; i> a[i]; cout =X - Ta dùng hàm : kq = lower_bound (a+1, a+n+1, x) - a 2.1.2.2 Hàm upper_bound(a+1,a+n+1,x)- a : cho vị trí mảng a có giá trị > x ( từ vị trí đến n), khơng có x mảng a đưa kết (n+1) Tương tự ta sử dụng hàm để đưa vị trí a[k]> x từ vị trí i đến vị trí j : Hàm upper_bound(a+i, a+j+1, x) - a Áp dụng : Cho dãy số nguyên a1, a2, a3, , an dãy xếp không giảm số ngun X Tìm vị trí k nhỏ cho a[k] >X Ta dùng hàm : kq = upper_bound (a+1, a+n+1, x) – a 2.1.2.3 Hệ 1: Để đếm số lượng phần tử dãy a1, a2, a3, , an có giá trị x.Dãy xếp không giảm Ta cần gọi : T= upper_bound (a+1,a+n+1,x) - lower_bound(a+1,a+n+1,x) T giá trị cần tìm 2.1.2.4 Hệ 2: Để đếm số lượng phần tử dãy a1, a2, a3, , an có giá trị thoả mãn x < a[i]< y (x, y giá trị cho trước) Coi dãy xếp theo thứ tự tăng dần U= lower_bound( a+1, a+n+1, y) - upper_bound( a+1, a+n+1, x) ; U giá trị cần tìm 2.1.2.5 Hệ 3: Để đếm số lượng phần tử dãy a1, a2, a3, , an xếp không giảm số nguyên x Đếm xem có phần tử có giá trị >x V= n+1 - ( upper_bound(a+1,a+n+1,x) -a); 8 2.1.3 Thuật toán chặt nhị phân theo kết Ý tưởng thuật toán : B1 : Đánh giá kết nằm đoạn ? - Kq thuộc đoạn [ L, R] ; - Xác định L ? - Xác định R ? B2 : Sử dụng vòng lặp While ( L = sum[i]+s không ? Code tham khảo : #include #define N int(1e5) using namespace std; int s[N+3], n, t , ans; bool check(int k) { for (int j=k; jb; for(int i=1;i>a[i]; sort(a+1,a+1+n); for(int i=1;i c[k]; a[i] + c[k] > b[j]; b[j] + c[k] >a[i] - Ta biến đổi sau: c[k]> b[j]- a[i]; c[k]a[i] – b[j] tương ứng |a[i]-b[j]|