(SKKN 2022) vận dụng mô hình tìm kiếm nhị phân và sử dụng các hàm tìm kiếm trong thư viện của ngôn ngữ lập trình c++ giúp học sinh giải quyết tối ưu một số dạng toán tìm kiếm nhằm nâng cao hiệu quả bồi dưỡng học sinh giỏi
Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
67,69 KB
Nội dung
1 MỞ ĐẦU 1.1 Lý chọn đề tài Trong chun đề ơn thi học sinh giỏi chun đề mơ hình thiết kế thuật tốn chia để trị với mơ hình Quay lui, mơ hình Tham lam, Quy hoạch động tạo thành công cụ quan trọng hỗ trợ thiết kế thuật toán giải số lượng lớn tập cách hiệu Trong đó, bật phải kể tới mơ hình thiết kế dựa ngun lí thuật tốn tìm kiếm nhị phân Được đánh giá thuật toán phổ biến lĩnh vực Tin học, mơ hình tìm kiếm nhị phân có hiệu đặc biệt thời gian chạy rõ ràng cách thức thiết kế thuật tốn Có thể nói, tìm kiếm nhị phân khơng đơn thuật tốn tìm kiếm mà cịn mơ hình tư thiết kế thuật tốn phổ biến Mơ hình dựa ngun lí hoạt động thuật tốn tìm kiếm nhị phân, tìm kiếm phần tử dãy giá trị xếp cách chia nhỏ miền tìm kiếm, sau lượt khơng gian tìm kiếm thu gọn giảm bớt nửa Quá trình dạy lớp mũi nhọn ôn thi HSG cấp Tỉnh, vận dụng mơ hình tìm kiếm nhị phân để giúp em nhìn nhận tốn từ nhiều góc độ khác Qua dễ dàng nhận việc áp dụng mơ hình để giải tốn Vì vậy, tơi chọn đề tài “Vận dụng mơ hình tìm kiếm nhị phân sử dụng hàm tìm kiếm thư viện ngơn ngữ lập trình C+ + giúp học sinh giải tối ưu số dạng tốn tìm kiếm nhằm nâng cao hiệu bồi dưỡng học sinh giỏi” làm sáng kiến kinh nghiệm năm học 2021 – 2022 để trao đổi với đồng nghiệp Đây phương pháp thực hiệu trường THPT Triệu Sơn 3, đồng thời hy vọng cách làm hoàn thiện, bổ sung nhân rộng trường THPT khác Tỉnh 1.2 Mục đích nghiên cứu - Phát triển kĩ thiết kế thuật tốn theo mơ hình chia để trị, tức giáo viên cần quan tâm kĩ tới khả nhận dạng tốn, khả nhìn mơ hình tìm nhị phân tốn - Vận dụng mơ hình tìm kiếm nhị phân để đưa thuật tốn phù hợp Bên cạnh đó, cần quan tâm tới yêu cầu học sinh đánh giá độ phức tạp thuật toán - Tìm hiểu vận dụng hàm tìm kiếm thư viện ngơn ngữ lập trình C++ để giải tốn tìm kiếm 1.3 Đối tượng nghiên cứu - Mơ hình tìm kiếm nhị phân - Các hàm tìm kiếm thư viện ngơn ngữ lập trình C++ - Một số dạng tập thi HSG cấp - Sự tư duy, ý thức học tập học sinh ôn thi học sinh giỏi 1.4 Phương pháp nghiên cứu - Điều tra khả tiếp cận mơn Tin học lập trình giáo viên THPT - Điều tra khả tiếp cận môn Tin học lập trình học sinh THPT - Tham khảo tài liệu, nghiên cứu đề thi, toán thiên tư toán học chuyển tốn lập trình, - Phương pháp thực nghiệm đối tượng học sinh THPT Nội dung sáng kiến kinh nghiệm 2.1 Cơ sở lí luận sáng kiến kinh nghiệm Trong bối cảnh toàn ngành GD-ĐT nỗ lực đổi phương pháp dạy học theo hướng phát huy tính tích cực chủ động học sinh hoạt động học tập Điều 24.2 Luật giáo dục nêu rõ: “Phương pháp giáo dục phổ thơng phải phát huy tính tích cực, tự giác, chủ động, sáng tạo học sinh, phù hợp với đặc điểm lớp học, môn học; bồi dưỡng phương pháp tự học, rèn luyện kỹ vận dụng kiến thức vào thực tiễn, tác động đến tình cảm, đem lại niềm vui, hứng thú học tập cho học sinh ” Như vậy, thấy định hướng đổi phương pháp dạy học khẳng định, khơng cịn vấn đề tranh luận Cốt lõi việc đổi phương pháp dạy học trường phổ thông giúp học sinh hướng tới việc học tập chủ động, chống lại thói quen học tập thụ động Với số nội dung đề tài này, học sinh tự học, tự rèn luyện thơng qua số tập, dạng tập cụ thể 2.2 Thực trạng vấn đề cần giải Qua thực tế giảng dạy trường THPT Triệu Sơn 3, nhận thấy học đến chương trình tin học lớp 11 đa số học sinh cho mơn học khó mơn học, nhiều em cịn sợ mơn học Mơ hình tìm kiếm nhị phân thường dạy sau giai đoạn học sinh học xong phần kĩ thuật lập trình Thời điểm này, học sinh sử dụng ngơn ngữ lập trình với cơng cụ có sẵn thư viện để thể thuật toán Tuy nhiên, khả tự nhìn nhận, đánh giá thiết kế thuật tốn cho tốn cịn hạn chế Khi gặp toán phải sử dụng kiểu liệu lớn nhiều em lúng lúng Việc giải toán với kiểu liệu lớn thực cần thiết cho em làm toán lập trình chương trình Tin học phổ thơng nói riêng việc giải toán thực tế nói chung Thực tế cho thấy, đề thi HSG tỉnh Thanh Hóa tỉnh có tập tìm kiếm với số lớn Nếu học sinh khơng hiểu rõ nhận biết tốt thường giải tập hay gặp nhiều sai sót không xử lý hết test theo yêu cầu 2.3 Các giải pháp giải vấn đề 2.3.1 Tổng quan mơ hình tìm nhị phân Dựa thuật tốn tìm kiếm nhị phân, mơ hình thiết kế thuật tốn dựa dạng thường có phát biểu tổng quát dạng: Tìm kiếm giá trị thoả mãn điều kiện miền giá trị thứ tự Nhận dạng tốn: Tìm giá trị miền giá trị xếp Định hướng số cơng việc cụ thể phân tích tốn: - Xác định giá trị cần tìm kiếm gì? - Xác định miền cần tìm: miền có giá trị xếpđó miền nào? - Q trình thực hiện: * Chia đơi miền tìm kiếm: + Xác định vị trí chốt (giữa) + Dựa mối quan hệ giữavị trí chốt giá trị cần tìm, tiến hành thu hẹp miền tìm kiếm (nửa trái, nửa phải) + Lặp lại trình tìm kiếm với miền giá trị Mặc dù thuật tốn tìm kiếm nhị phân có nhiều cách cài đặt, ngồi thư viện STL C++ có hàm hỗ trợ việc tự cài đặt hiểu mơ hình quan trọng việc vận dụng thiết kế thuật tốn theo mơ hình tìm kiếm nhị phân Dưới cách cài đặt phổ biến C++: int solve(int a[], int x, int L, int R) //tìm giá trị x dãy a[] từ số L tới số R { ans = -1; while(Lx - Miền tìm kiếm A[1]…A[N] tăng dần - Khi L x: chốt nghiệm tiềm ans = mid Thu hẹp miền tìm kiếm nửa đầu dãy tức [L, mid-1] o Ngược lại: Tìm kiếm miền [mid+1, R] Cài đặt hàm tìm kiếm C++ int upper(int a[], int l, int r, int x) { //Tìm phần tử có giá trị nhỏ mà >x int ans = -1; while(l x) { ans = mid; r = mid - 1; } else l = mid +1; } return ans; } Sử dụng số hàm tìm kiếm có sẵn thư viện STL C++ - Hàm binary_search: hàm tìm kiếm nhị phân có độ phức tạp O(logn) Cấu trúc hàm sau: binary_search(a+1, a+n+1, x) có nghĩa tìm x dãy a (đã xếp tăng dần) từ vị trí đến vị trí n Nếu có kết trả true, ngược lại trả false binary_search(a, a+n, x): có nghĩa tìm x dãy a (đã xếp tăng dần) từ vị trí đến vị trí n-1 Nếu có kết trả true, ngược lại trả false - Hàm lower_bound(a+1, a+n+1, x) cho vị trí nhớ có giá trị lớn x mảng a(a[1],a[2]…., a[n]) - Hàm upper_bound(a+1, a+n+1, x) cho địa nhớ có giá trị lớn x mảng a(a[1], a[2],…a[n]) 2.3.3.1.2 Một số tập vận dụng đề thi học sinh giỏi Bài tập 1: Count x ( Nguồn Đề thi HSG tỉnh Lâm đồng 2015) Cho dãy A gồm N phần tử xếp tăng dần Q truy vấn, truy vấn gồm số nguyên x yêu cầu đếm số lượng phần tử có giá trị x? Input: - Dòng đầu ghi N, Q - Dòng thứ hai ghi N số nguyên - Q dòng cuối, dòng ghi số nguyên x Output: Với truy vấn, in kết dịng Ví dụ: Input Output 10 1223444566 Ý tưởng giải thuật: Với truy vấn: - Tìm id1 số vị trí x đầu tiên, id2 số vị trí sau x cuối số lượng id2-id1 - id1 = lower_bound; id2=upper_bound Cài đặt hàm tìm kiếm C+ int countx(int a[], int l, int r, int x) { //Đếm dãy a từ a[l] đến a[r] số lượng phần tử x int id1 = lower(a, l, r, x); int id2 = upper(a, l, r, x); return id2-id1; } Bài tập 2: COUNTONE.CPP (Nguồn: Đề thi HSG tỉnh Yên bái 2014) Cho dãy A gồm số nguyên 0, 1; Hãy đếm số lượng phần tử có giá trị dãy xếp giảm dần Input: - Dòng đầu ghi số nguyên n số lượng phần tử dãy (1 ≤ n ≤ 106) - Dịng thứ hai ghi n số ngun, số có giá trị - Dữ liệu đảm bảo dãy xếp giảm dần Output: Một số nguyên số lượng phần tử dãy Ví dụ: input Output 111000 3 111 0000 Ý tưởng giải thuật1: (vận dụng trên): id1 = lower(a,1,n,0); id2=upper(a,1,n,0) kq=id2-id1 Ý tưởng giải thuật : tìm nhị phân trực tiếp dãy - Nhận xét: dãy toàn số 0, toàn số Tìm vị trí i thoả mãn a[i]