(Skkn mới nhất) vận dụng thuật toán tìm kiếm nhị phân vào giải một số bài toán bằng ngôn ngữ lập trình c++ và python

51 5 0
(Skkn mới nhất) vận dụng thuật toán tìm kiếm nhị phân vào giải một số bài toán bằng ngôn ngữ lập trình c++ và python

Đ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

sa ng ki en SỞ GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN ki nh TRƯỜNG THPT TƯƠNG DƯƠNG ng hi em w n SÁNG KIẾN KINH NGHIỆM lo ad th yj VẬN DỤNG THUẬT TỐN TÌM KIẾM NHỊ PHÂN VÀO GIẢI MỘT SỐ BÀI TỐN BẰNG NGƠN NGỮ LẬP TRÌNH C++ VÀ PYTHON uy ip la an lu n va ll fu oi m z z vb k jm ht Số điện thoại: 0949239048 at Giáo viên: Đinh Viết Mạnh Tổ: Tốn-Lí-Tin-CN nh Mơn: Tin học m co l gm Năm học: 2022-2023 sa ng ki en PHẦN I ĐẶT VẤN ĐỀ ki nh Lý chọn đề tài ng Môn Tin học giữ vai trò chủ đạo việc chuẩn bị cho học sinh khả tìm kiếm, tiếp nhận mở rộng tri thức sáng tạo thời đại thông tin, hỗ trợ đắc lực trình học tập tự học học sinh hi em Điều khẳng định vai trị vị trí quan trọng Tin học tồn xã hội w Do người, học sinh cần hiểu trang bị kiến thức Tin học để theo kịp với thời đại, với phát triển xã hội Vì học tin cần trang bị kiến thức, kỹ lập trình để giải toán dễ dàng n lo ad th Trong chương trình giáo dục phổ thơng 2018 ngơn ngữ lập trình Python đưa vào dạy học từ lớp 10 năm học 2022-2023, Ngồi ngơn ngữ lập trình Python C++ ngơn ngữ lập trình phổ biến chương trình dạy học tính ứng dụng ngôn ngữ nhiều, kỳ thi tin học trẻ, thi vào chuyên tin, học sinh giỏi tỉnh… yj uy ip la lu an Khi giải tốn Tin học người lập trình ln mong muốn viết chương trình với thuật tốn tối ưu, thời gian thực nhanh, nhớ hạn chế…Tuy nhiên, toán Tin học thường đa dạng, phong phú nên để tìm thuật tốn tối ưu phù hợp liệu tốn việc khơng dễ dàng Trong lập trình tin học có nhiều phương pháp giải toán để đảm bảo thời gian, khơng gian khơng dễ Vì lựa chọn thuật toán để tối ưu quan trọng n va ll fu oi m nh at Qua q trình giảng dạy, học tập, tìm tịi đặc biệt tham gia bồi dưỡng học sinh giỏi nhiều năm qua, đề thi có tốn kích thước lớn, giải cách thơng thường khơng tối ưu mặt thời gian, không vét hết trường hợp xảy tốn Tuy nhiên, áp dụng phương pháp tìm kiếm nhị phân (thường gọi chặt nhị phân) giải tốt tất trường hợp z z vb k jm ht m (Khoa học máy tính) năm học tới Ngồi tơi cung cấp test cho tập giúp học sinh tự luyện code cách hiệu Để cải thiện thời gian thuật tốn cần kết hợp thuật tốn tìm kiếm nhị phân với số phương pháp co Đề tài tập trung nghiên cứu thuật tốn tìm kiếm nhị phân, đưa ứng dụng thuật toán giải toán máy tính Nhằm giúp học sinh vận dụng thuật tốn linh hoạt, giúp cải tiến thời gian không gian gặp dạng toán này, em hiểu kỹ học chuyên đề tin 11 l gm Quá trình dạy lớp mũi nhọn ôn thi HSG cấp Tỉnh, vận dụng phương pháp 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 phương pháp để giải tốn Vì vậy, tơi chọn đề tài “Vận dụng thuật tốn tìm kiếm nhị phân vào giải số tốn ngơn ngữ lập trình C++ Python " sa ng ki en ki khác quy hoạch động, tham lam…, cấu trúc liệu set, map, hash…., để giải toán hiệu nh ng Để hoàn thành nhiệm vụ đề tài, nghiên cứu nhiều sách chuyên đề Tin học dành cho học sinh giỏi, tài liệu trang web hi em Mục đích nghiên cứu - Với lý chọn đề tài trình bày trên, tơi mong muốn đề tài giúp đỡ phần khó khăn nhận dạng tốn tìm kiếm nhị phân q trình ơn luyện học sinh giỏi w n lo ad - Nhìn nhận, giải số tốn phương pháp tìm kiếm nhị phân th - Giúp em tiếp cận số hàm có sẵn thư viện C++, Python yj uy - Từ bồi dưỡng học sinh lực giải vấn đề giải toán Tin học, đồng thời rèn luyện nâng cao kĩ lập trình cho em Đặc biệt học sinh tham gia dự thi học sinh giỏi cấp tỉnh THCS, THPT thi vào trường chuyên ip la n ll fu - Một số tập thi HSG cấp va - Thuật tốn tìm kiếm nhị phân an lu Đối tượng phạm vi nghiên cứu m oi - Sự tư duy, ý thức học tập học sinh ôn thi học sinh giỏi nh at - Chương trình Tin học THCS, THPT để bồi dưỡng học sinh giỏi Tin học thi vào trường chuyên THPT z vb jm ht Để thực đề tài này, sử dụng phương pháp: z Phương pháp nghiên cứu k - Phương pháp nghiên cứu xây dựng sở lí thuyết: Cơ sở lý thuyết phương pháp tìm kiếm nhị phân, số toán đề thi cấp; Sự hứng thú học môn Tin học ý thức tự học học sinh môn học - Giúp cải thiện thuật toán tối ưu hơn, đáp ứng thời gian theo yêu cầu đề - Giúp học sinh tiếp cận hàm bisect_left, bisect_right Python để giải tập - Là tài liệu cho học sinh giỏi cấp trường cấp tỉnh tham khảo Đồng thời tài liệu cho giáo viên dạy đội tuyển bậc THCS THPT mơn tin học m Tính đóng góp đề tài co - Phương pháp điều tra khảo sát, thống kê, để so sánh nhóm thực nghiệm đối chứng l gm - Phương pháp bồi dưỡng lực tự học, tư duy, giải vấn đề cho học sinh sa ng ki en PHẦN II: NỘI DUNG ki nh I Cơ sở lý luận thực tiễn ng Cơ sở lý luận hi em Giới thiệu thuật tốn tìm kiếm nhị phân, hàm tìm kiếm nhị phân có sẵn C++, Python nhìn nhận đánh giá độ phức tạp thuật tốn 1.1 Thuật tốn tìm kiếm nhị phân gì? w n Thuật tốn tìm kiếm nhị phân (Binary Search) thuật tốn tìm kiếm danh sách xếp theo thứ tự tăng dần giảm dần Thuật toán hoạt động cách so sánh giá trị vị trí danh sách với giá trị cần tìm kiếm Nếu giá trị vị trí giá trị cần tìm kiếm, thuật tốn trả vị trí Nếu giá trị vị trí lớn giá trị cần tìm kiếm, thuật tốn tiếp tục tìm kiếm nửa danh sách Nếu giá trị vị trí nhỏ giá trị cần tìm kiếm, thuật tốn tìm kiếm nửa sau danh sách Quá trình lặp lại tìm thấy giá trị cần tìm kiếm danh sách phần tử lo ad th yj uy ip la an lu n va 1.2 Khái niệm hàm lower_bound, upper_bound, bisect_left, bisect_right có sẵn C++ Python fu ll 1.2.1 Giới thiệu hàm lower_bound, bisect_left C++ Python m oi - Hàm lower_bound(a+1, a+n+1,x) -a với a[0]=-∞; a[n+1]=+∞: Đưa 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) at nh z z - Hàm bisect_left(a, x): Cho vị trí mảng a có giá trị >= x; khơng có x mảng a đưa kết (n) Tương tự ta đưa vị trí với giá trị a[k] >=x từ đoạn i đến j dùng hàn bisect_left(a, x,lo=i,hi=j); khơng tìm thấy trả vị trí hi vb k jm ht co l gm Áp dụng: Cho dãy số nguyên a1, a2, a3, , an xếp không giảm số nguyên x Tìm vị trí k nhỏ cho a[k] >= x m Trong C++: kq = lower_bound(a+1, a+n+1, x) - a Trong Python: kq= bisect.bisect_left(a,x); 1.2.2 Giới thiệu hàm upper_bound, bisect_right C++ Python - Hàm upper_bound(a+1,a+n+1,x)- a với a[0]=-∞; a[n+1]=+∞: Đưa vị trí mảng a có giá trị > x (từ vị trí l đến n), khơng có x mảng a đưa kết (n+1) - Hàm bisect_right(a, x): Cho vị trí mảng a có giá trị >x; khơng có x mảng a đưa kết (n) Tương tự ta đưa vị trí với giá trị a[k] >x từ đoạn i đến j dùng hàm bisect_right(a,x,lo=i,hi=j); khơng tìm thấy trả vị trí hi sa ng ki en ki Áp dụng: Cho dãy số nguyên a1, a2, a3, ,an xếp khơng giảm số ngun x Tìm vị trí k nhỏ cho a[k] > x nh ng Trong C++: kq = upper_bound(a+1, a+n+1, x) - a hi Trong Python: kq= bisect_right(a,x) em 1.2.3 Hệ 1: Đếm số lượng phần tử dãy a 1, a2, a3, ,an có giá trị x Dãy xếp không giảm w Trong C++ ta có T = upper_bound(a+1, a+n+1, x) - lower_bound(a+1,a+n+1,x) n lo Trong Python ta có: T = bisect_right(a,x)-bisect_left(a,x) ad th 1.2.4 Hệ 2: Đếm số lượng phần tử dãy a1, a2, , an có giá trị thỏa mãn x < < y (x, y hai giá trị cho trước) Xem dãy xếp theo thứ tự tăng dần yj uy ip Trong C++ ta có T = lower_bound(a+1, a+n+1, y) - upper_bound(a+1, a+n+1, x) la lu Trong Python ta có T= bisect_left(a, y)-bisect_right(a,x) an 1.2.5 Hệ 3: Đếm số lượng phần tử dãy a1, a2, , an xếp không giảm số nguyên x Đếm xem có phần tử có giá trị > x n va oi nh 1.3 Độ phức tạp thuật tốn m Trong Python ta có T = n - (bisect_right(a, x)) ll fu Trong C++ ta có T = n+1 - (upper_bound(a+1, a+n+1, x) - a) at Thuật toán tìm kiếm nhị phân (Binary Search) độ phức tạp tính tốn thuật tốn tìm kiếm nhị phân trường hợp tốt O(1), trường hợp xấu O(logN) Thuật tốn tìm kiếm nhị phân thực với dãy xếp, nên dãy chưa xếp cần phải tính đến thời gian cho việc xếp lại dãy trước áp dụng tìm kiếm nhị phân z z vb k jm ht 2.1.1 Thuận lợi - Với bùng nổ ngành cơng nghệ thơng tin chương trình giáo dục phổ thông 2018 em học sinh học lập trình scratch từ tiểu học đến THCS, m 2.1 Đặc điểm tình hình co Nêu thực trạng vấn đề, thuận lợi, khó khăn học sinh việc giải toán lớn, tốn ơn thi học sinh giỏi Qua giải vấn đề đưa tốn điển hình để so sánh sử dụng thuật tốn tìm kiếm nhị phân với số phương pháp khác, sử dụng thuật tốn tìm kiếm nhị phân vận dụng giải toán đề thi ôn luyện Trang bị kiến thức cho học sinh giáo viên để giải tốt gặp tốn có liên quan đến sử dụng thuật tốn tìm kiếm nhị phân, sử dụng thuật tốn tìm kiếm nhị phân cách hiệu l gm Cơ sở thực tiễn sa ng ki en ki THPT học Python giúp em say mê, hứng thú, u thích ngơn ngữ lập trình ngày nhiều nh ng - Ngày máy tính ngày có tốc độ xử lý cao đáp ứng u cầu xử lý tốn có liệu lớn thời gian thực ngắn hi em - Các thi lập trình ngày tổ chức nhiều hơn, việc học, xem tài lệu, luyện làm code dễ dàng hơn, xem tài liệu web kênh youtube… w n lo 2.1.2 Khó khăn ad - Ngơn ngữ lập trình Python cịn mẽ, kiến thức chương trình Tin học phổ thơng cịn hạn chế, chưa đủ đáp ứng cho việc giải số toán kỳ thi học sinh giỏi Tỉnh có yêu cầu liệu lớn thời gian thực ngắn th yj uy ip la - Thuật tốn 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 tốn Tuy nhiên, khả tự nhìn nhận, đánh giá thiết kế thuật toán cho tốn cịn hạn chế an lu n va fu ll - 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 tốn lập trình chương trình Tin học phổ thơng nói riêng việc giải tốn thực tế nói chung oi m at nh z - Thực tế cho thấy, đề thi HSG tỉnh 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 z vb k jm ht 2.2 Thực trạng trước áp dụng đề tài m co - Trong nội dung thi học sinh giỏi Tin học cấp, có nhiều thường giải với nhiều cách khác nhau, cách khơng phải cách giải hết liệu giới hạn toán, việc hướng đến giải hết test từ bé đến lớn với thời gian đảm bảo yêu cầu (thường 1s) vấn đề học sinh làm Một phương pháp giúp học sinh giải nhiều mức độ vừa khó tìm kiếm nhị phân l gm - Nhiều học sinh hiểu thuật tốn tìm kiếm nhị phân việc vận dụng để giải tốn phương pháp thực chưa hiệu quả, chưa nhìn nhận cách giải tốn phương pháp tìm kiếm nhị phân, tốn dạng tìm kiếm nhị phân theo kết sa ng ki en II Các giải pháp giải vấn đề đề tài ki nh Giới thiệu ví dụ minh họa thuật tốn tìm kiếm nhị phân mơ thuật tốn ng hi Thuật tốn tìm kiếm nhị phân thuật tốn lĩnh vực khoa học máy tính, sử dụng để tìm kiếm giá trị cụ thể mảng xếp Thuật toán hoạt động cách lặp lặp lại việc chia đôi mảng trình tìm kiếm, đến tìm thấy giá trị cần tìm mảng bị chia nhỏ đến mức phần tử em w n lo ad 1.1 Xét ví dụ sau: Cho dãy số gồm N phần tử xếp theo thứ tự khơng giảm Tìm xem dãy có giá trị X hay không? th yj Ý tưởng: + Đầu tiên, mảng cần xếp theo thứ tự tăng dần giảm dần + Lấy phần tử vị trí phần nguyên phép chia (left+right) cho so sánh với giá trị cần tìm Nếu giá trị vị trí phần ngun phép chia (left+right) cho giá trị cần tìm, thuật tốn trả vị trí giá trị mảng + Nếu giá trị vị trí phần nguyên phép chia (left+right) cho lớn giá trị cần tìm, thuật tốn tiếp tục tìm kiếm mảng bên trái phần nguyên phép chia (left+right) cho + Nếu giá trị vị trí phần nguyên phép chia (left+right) cho nhỏ giá trị cần tìm, thuật tốn tiếp tục tìm kiếm mảng bên phải phần nguyên phép chia + Thuật tốn lặp lại q trình tìm thấy giá trị cần tìm mảng bị chia nhỏ đến mức phần tử uy ip la an lu n va ll fu oi m at nh z z vb jm ht Các bước để sử dụng thuật tốn tìm kiếm nhị phân toán sau: k - Khởi tạo giá trị left right N - 1, N số phần tử dãy m co l gm - So sánh X với phần tử dãy a[mid], với mid phần nguyên phép chia (left+right) cho 2, có ba trường hợp xẩy ra: ● Nếu X=a[mid] trả số mid kết thúc chương trình ● Nếu Xa[mid] phần tử cần tìm nằm dãy bên phải phần tử a[mid], cập nhật giá trị left=mid+1, giữ nguyên giá trị right Lặp lại bước tìm thấy phần tử X phạm vi tìm kiếm rỗng(right=P Nếu g thoả mãn điều kiện cập nhật tìm g tốt (xa vị trí i hơn) bên trái đoạn [d, g-1] ngược lại tìm g bên phải đoạn [g+1, c] l gm Với vị trí i = 2, 3, , n ta tìm vị trí i thuộc đoạn [1, i-1] nhỏ cho a[i]f[g]>=P Khi ta đoạn i-g thỏa mãn điều kiện toán, so sánh độ dài đoạn [i,g] với phương án tối ưu Ta có sa ng ki en Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python ki nh ng hi em w n lo ad th yj uy ip la an lu n va ll fu oi m at nh z z 4.2 DẠNG 2: Tìm kiếm nhị phân theo kết vb Tìm độ dài đoạn dài dãy bao k jm Cho dãy số nguyên gồm hai giá trị ht Bài 1: Hai giá trị (ĐỀ HSG NGHỆ AN B 2018-2019) gm • Dịng : số ngun • Dòng : số nguyên l Dữ liệu: Vào từ file văn TWOVALS.INP co ; m Kết quả: Ghi file văn TWOVALS.OUT số nguyên độ dài đoạn dài bao gồm hai giá trị theo phương án tìm Ví dụ TWOVALS.INP TWOVALS.OUT 1323312 38 sa ng ki en Ý tưởng thuật tốn: Chặt nhị phân tìm kết ki nh - Kết toán cần tìm đoạn [1, n] ng - Gọi g độ dài đoạn gồm giá trị cần tìm với giá trị g cần kiểm tra đoạn g có thoả mãn hai giá trị khơng thỏa mãn cần lưu lại kết quả, tăng giá trị g lên để tìm đoạn tốt cách tìm g bên phải ngược lại tìm g bên trái hi em - Xây dựng hàm check kiểm tra, sử dụng map để lưu trữ số lần xuất phần tử dãy liên tiếp Nếu kích thước map khơng q 2, tức có tối đa giá trị khác dãy liên tiếp này, hàm trả true Ngược lại, kích thước map lớn 2, tức có giá trị khác dãy liên tiếp này, hàm trả false w n lo ad th yj Độ phức tạp thuật toán: O(nlog2n) uy Ngơn ngữ lập trình Python ip Ngơn ngữ lập trình C++ la an lu n va ll fu oi m at nh z z vb k jm ht m co l gm Link test tham khảo: https://drive.google.com/drive/u/0/folders/1sm6ocXiCfrxGDkISzsLgKuOyLQzyP njP Bài ĐOẠN MAX (ĐỀ HSG NA BẢNG A 2013-2014) Cho chuỗi kí tự S gồm tồn chữ in hoa (A…Z) với độ dài không vượt 104 39 sa ng ki en ki Yêu cầu: Hãy tìm đoạn kí tự liên tiếp dài cho khơng có kí tự xuất nhiều lần Trong trường hợp có nhiều đoạn có chiều dài dài nhất, đoạn xuất chuỗi S nh ng hi Dữ liệu: Vào từ văn DOANMAX.INP: Gồm dòng chứa chuỗi S em Kết quả: Ghi file văn DOANMAX.OUT - Chỉ dòng chứa số nguyên P L tương ứng vị trí chiều dài đoạn dài tìm Lưu ý: Có 80% số test có độ dài xâu S khơng vượt q 255 Ví dụ: w n lo DOANMAX.OUT ad DOANMAX.INP th 34 yj ABABCDAC uy ip Ý tưởng thuật tốn: Chặt nhị phân tìm kết la - Kết toán thuộc đoạn [1, s.length()] an lu - Gọi mid độ dài đoạn chứa kí tự khác cần tìm với giá trị mid cần kiểm tra đoạn độ dài mid có thõa mãn chứa kí tự khác không thõa mãn cần lưu lại kết quả, tăng giá trị mid lên để tìm đoạn tốt cách tìm g bên phải ngược lại tìm mid bên trái n va ll fu oi m - Hàm check() sử dụng để kiểm tra xem đoạn có độ dài mid chuỗi s có chứa kí tự khác hay khơng Chương trình sử dụng unordered_map để đếm số lần xuất kí tự đoạn con, số kí tự khác đoạn mid, nghĩa đoạn chứa kí tự khác hàm trả giá trị true at nh z z ht Ngơn ngữ lập trình Python k jm Ngơn ngữ lập trình C++ vb Độ phức tạp thuật tốn: O(nlog2s.length()) m co l gm 40 sa ng ki en ki nh ng hi em w n lo ad th yj uy ip la Link test tham khảo: https://drive.google.com/drive/u/0/folders/1P-beYlfiqeCpTCRKvaBaEu5mmx9VjmG Bài 3: ĐOẠN CON (ĐỀ TIN HỌC TRẺ B NGHỆ AN 2020) an lu n va ll fu Cho dãy số nguyên dương a1, a2, , aN số nguyên k Một đoạn [i, j] định nghĩa dãy số a1, ai+1, , aj Độ dài đoạn j - i + m oi Yêu cầu: Trong số đoạn có độ dài lớn k dãy số, tìm đoạn có trung bình cộng phần tử lớn at nh z Input: Dòng chứa số nguyên dương n, k (n < 106; k < 109) z vb Dòng thứ hai chứa n số nguyên a1, a2, , aN (ai < 109) k jm ht Output: Ghi hình số nguyên phần nguyên trung bình cộng lớn tìm Kết đưa lấy chữa số thập phân sau dấu phẩy Đoạn cần tim 7,9,2,8 có trang bình cộng 6.500 m co 37928 6.500 Giải thích l 53 Output gm Input Ý tưởng thuật toán: Thực phương pháp chặt nhị phân theo kết Ta biết cần tìm giá trị lớn res thỏa mãn >= res tương đương với (a[i]+… +a[j]) >= res*(j-i+1) Suy ta có: (a[i]- res) +… + (a[j] - res) >=0 Thực chặt nhị phân để tìm kết res Với giá trị mid, ta giảm phần tử dãy a mid đơn vị theo cơng thức trên, sau kiểm tra dãy có đoạn liên tiếp có tổng dương hay khơng? Nếu có ghi nhận giá trị res = mid tăng giá trị mid, ngược lại giảm giá trị mid 41 sa ng ki en Độ phức tạp thuật toán O(nlogn) ki nh Link test tham khảo: https://drive.google.com/drive/u/0/folders/1UOfVmk5z8MwHuliU6oUeYbBbpHD im2-_ ng hi em Ngôn ngữ lập trình C++ Ngơn ngữ lập trình Python w n lo ad th yj uy ip la an lu n va ll fu oi m at nh z z vb k jm ht m co l gm 4.3 DẠNG 3: Ứng dụng hàm lower_bound, upper_bound, bisect_left, bisect_right Bài Tổng x Cho hai dãy số nguyên a1, a2, a3, …., aM b1, b2, b3, …, bM số nguyên x Hãy đếm xem có cặp (i, j) thỏa mãn ai+bj=x Input: File sumx.inp: ● Dòng ghi ba số nguyên dương M, N, x (1≤M, N≤100000) ● Dòng thứ hai ghi số nguyên a1, a2, a3, , aM (│ai│≤109) 42 sa ng ki en ● Dòng thứ ba ghi số nguyên b1, b2, …, bN ((│bj│≤109) ki nh Output: File sumx out số nguyên số cặp (i, j) tìm ng Ví dụ: hi em SUMX.INP SUMX.OUT 455 w 3142 n lo 16434 ad th Ý tưởng thuật toán: Thuật toán đơn giản cần duyệt vòng lặp for độ phức tạp thuật tốn O(m.n) Ta thấy ý nghĩa vịng lặp j với a[i] cố định vòng lặp j đếm xem có phần tử mảng b có giá trị =x-a[i] Để giảm độ phức tạp thuật toán trước tiên em xếp mảng a sau thực việc đếm nhị phân xem có phần tử=x-b[i], sử dụng hàm lower_bound, upper_bound, bisect_left, bisect_right xác định số cặp xuất x-b[i] mảng a yj uy ip la va Ngơn ngữ lập trình Python n Ngơn ngữ lập trình C++ an lu Độ phức tạp thuật toán: O(mlogn) ll fu oi m at nh z z vb k jm ht m co l gm Link test tham khảo: https://drive.google.com/drive/u/0/folders/1yCV1IMXXze0WLuT8tF8RYb1ZMzcNBGu Bài Xâu (Đề HSG Thanh Hoá 2016-2017) Một xâu gọi xâu nhị phân chứa hai ký tự "0" "1" Xâu v gọi xâu w xâu v có độ dài khác gồm ký tự liên tiếp xâu w Ví dụ: xâu "010" có xâu "0", "1", "0", "01", "10", "010" 43 sa ng ki en ki Yêu cầu: Cho trước giá trị k, đếm xem có xâu chứa k ký tự "1" nh ng Dữ liệu vào: - Dòng 1: Chứa số nguyên k (0 ≤ k ≤ 106) hi - Dòng 2: Chứa xâu nhị phân có độ dài ≤ 106 em Dữ liệu ra: Ghi số nguyên kết tìm SUBSTR.OUT w SUBSTR.INP n lo ad 01010 th yj Giải thích: có xâu chứa ký tự là: "101", "0101", "1010", "01010" uy Ý tưởng thuật toán: Sử dụng hàm lower_bound, upper_bound, bisect_left, bisect_right ip la lu - Sử dụng f để tính tổng số lượng kí tự ‘1’ xâu s an - Cụ thể duyệt mảng f với giá trị i đoạn [i+1, n] tìm vị trí j cho f[i]+k=f[j] Gọi left vị trí cần tìm sử dụng hàm lower_bound, bisect_left tìm vị trí >=f[i]+k, right vị trí giá trị>f[i]+k dùng hàm upper_bound, bisect_right Vậy cập nhật kết right-left+1 n va ll fu oi nh Ngơn ngữ lập trình Python at Ngơn ngữ lập trình C++ m Độ phức tạp thuật tốn: O(nlogn) z z vb k jm ht m co l gm 44 sa ng ki en ki nh ng hi em Link test tham khảo: https://drive.google.com/drive/u/0/folders/1I4DaAYWt6gXqV36pq_Am3yFLEfV U4m2H w n lo ad yj Mục đích khảo sát th III Khảo sát cấp thiết tính khả thi giải pháp đề xuất uy ip Việc tổ chức khảo sát cấp thiết tính khả thi giải pháp “Vận dụng thuật tốn tìm kiến nhị phân vào giải số tốn ngơn ngữ lập trình C++ Python” nhằm mục đích sau: la lu an - Thứ nhất, kiểm tra tính đắn đề tài n va - Thứ hai, kiểm tra lại tính hiệu biện pháp sư phạm nhằm vận dụng thuật tốn tìm kiến nhị phân vào giải số tốn ngơn ngữ lập trình C++ Python vào ôn học sinh giỏi Trường THPT Tương Dương ll fu m oi - Thứ ba, kiểm tra chất lượng HS việc vận dụng thuật tốn tìm kiếm nhị phân at nh z - Thứ tư, giúp giáo viên nhận thức tầm quan trọng việc phát triển lực tư để giải tốn lập trình thơng qua toán cụ thể cho học sinh z vb 2.2 Phương pháp khảo sát thang đánh giá - Phương pháp sử dụng để khảo sát Trao đổi bảng hỏi; với thang đánh giá 04 mức 45 m - Các giải pháp đề xuất có khả thi học sinh học thuật toán tìm kiếm nhị phân hay khơng? co - Các giải pháp đề xuất như: Vận dụng thuật tốn tìm kiến nhị phân vào giải số toán ngơn ngữ lập trình C++ Python có thực cấp thiết vấn đề nghiên cứu không? l gm Nội dung khảo sát tập trung vào 02 vấn đề sau: k jm 2.1 Nội dung khảo sát ht Nội dung phương pháp khảo sát sa ng ki ki nh ng Mức Khơng cấp thiết Ít cấp thiết Cấp thiết Rất cấp thiết hi Thang đánh giá em en TT w n lo Điểm trung bình X tính theo phần mềm Exel ad Đối tượng khảo sát th yj Tổng hợp đối tượng khảo sát Trong năm học 2022-2023 Nhà trường phân công giảng dạy môn tin khối 10, 11 đồng thời đảm nhiệm công việc ôn thi học sinh giỏi cấp trường, cấp tỉnh mơn tin Vì cơng tác ơn HSG có hiệu thân tơi chọn nhóm đối tượng học sinh, nhóm học sinh khối 10, nhóm học sinh khối 11 bắt đầu ôn từ đầu năm học Đây củng đối tượng cần khảo sát, ngồi tơi khảo sát số GV số trường khác THPT Tương Dương 2, Trường THPT Yên thành 3, Trường THPT Nghi Lộc 2, Trường THPT Nghi Lộc 5, Trường THPT Con cuông uy ip la an lu n va ll fu oi m at nh Link khảo sát: https://docs.google.com/forms/d/e/1FAIpQLScsywv4QNIllbciekjCSdmZ18e0EnH FggSS0emYNSq4EB1kWg/viewform?usp=sharing z z vb Link kết khảo sát: k jm ht https://docs.google.com/forms/d/11u6aNQULFgcFusqPbkCUx_dmyFiTperwHBoRg5EpHE/edit#responses 10A1 10A2 3 10A3 11A1 11A2 GV THPT Tổng 25 m co Số lượng l Đối tượng gm TT 46 sa ng ki en Kết khảo sát cấp thiết tính khả thi giải pháp ki nh 4.1 Sự cấp thiết giải pháp đề xuất ng Đánh giá cấp thiết giải pháp đề xuất hi em Mức độ đánh giá Rất cấp Cấp thiết thiết TT Biện pháp w Ít cấp thiết n lo SL Điểm SL Điểm SL Không cấp thiết ∑ Điểm TB Mức SL Điểm ad th Giải pháp 1: Giới thiệu ví dụ minh họa 14 56 thuật tốn tìm kiếm nhị phân mơ thuật tốn yj uy 21 1 84 3.36 1 84 3.36 1 87 3.48 ip 15 an lu n va ll fu Giải pháp 3: So sánh thuật tốn tìm kiếm nhị phân với số thuật toán khác la Giải pháp 2: Phân loại 15 60 thuật tốn tìm kiếm nhị phân 12 Giải pháp 4: Bài tập vận dụng từ đến nâng cao 18 72 12 Trung bình chung 16 64 15 3.25 6.5 0.75 0.75 86.25 3.45 oi m 17 68 at nh z 90 3.6 vb z k jm ht m co l gm Biểu đồ đánh giá cấp thiết giải pháp đề xuất: 47 sa ng ki en ki nh Từ số liệu thu bảng thông qua biểu đồ rút số nhận xét sau: ng hi - Các giải pháp mà đưa việc áp dụng sáng kiến kinh nghiệm cho thấy cấp thiết lớn việc vận dụng thuật tốn tìm kiếm nhị phân để giải toán tin học em w - Điểm giải pháp 1, thuộc mức cấp thiết, giải pháp 3, mức cấp thiết, thể mức điểm gần tương đồng nói lên cấp thiết giải pháp giúp cho em cần kiến thức phần thuật tốn tìm kiếm nhị phân, cần thiết cho giáo viên việc vận dụng thuật toán tìm kiếm nhị phân để giải số tốn n lo ad th yj uy 4.2 Tính khả thi giải pháp đề xuất ip la Đánh giá tính khả thi giải pháp đề xuất an lu Rất khả thi Khả thi Ít khả thi ll fu TT Biện pháp n va Mức độ đánh giá TB Mức SL Điểm SL Điểm oi Điểm SL Điểm ∑ m SL Không khả thi 56 18 1 Giải pháp 2: Phân loại thuật tốn tìm kiếm nhị phân 15 60 24 0 88 3.52 Giải pháp 3: So sánh thuật tốn tìm kiếm nhị phân với số thuật toán khác 14 56 24 1 85 3.4 Giải pháp 4: Bài tập vận dụng từ đến nâng cao 18 72 12 0 90 3.6 Trung bình chung 15.25 61 6.5 19.5 2.75 5.5 0.5 0.5 86.5 3.46 at 14 z nh Giải pháp 1: Giới thiệu ví dụ minh họa thuật tốn tìm kiếm nhị phân mơ thuật tốn z vb 83 3.32 k jm ht m co l gm 48 sa ng ki en Biểu đồ tính khả thi giải pháp đề xuất ki nh ng hi em w n lo ad th yj uy ip la Mối quan hệ tính cấp thiết tính khả thi an lu n va ll fu oi m at nh z z vb k jm ht m 49 co - Thông qua bảng đánh giá biểu đồ ta thấy giải pháp 2, giải pháp 3, giải pháp có điểm trung bình tương đối gần thuộc mức khả thi, giải pháp có điểm trung bình thấp thuộc mức khả thi Qua ta thấy giải pháp áp dụng hiệu có tính khả thi cao Ta có đánh giá học sinh, GV giải pháp, từ tính khả thi đề tài lớn Phần lớn em mong muốn tiếp tục học thuật tốn tìm kiếm nhị phân vào giải toán để mang lại hiệu thời gian tối ưu Trong kì thi học sinh giỏi cấp phần thuật tốn tìm kiếm nhị phân khơng thể thiếu để hổ trợ cho giáo viên học sinh q trình ơn luyện l gm Từ số liệu thu bảng thông qua biểu đồ rút số nhận xét sau: sa ng ki en PHẦN III: KẾT LUẬN ki nh Với mục tiêu đề đề tài ng Đề tài trình bày phần Nêu thực trạng, vấn đề cần giải mà giáo viên bồi dưỡng học sinh giỏi cần phải ý Trình bày cụ thể, đầy đủ, chi tiết mặt lí thuyết thuật tốn tìm kiếm nhị phân hi em Ngồi cịn lấy toán nhằm nâng cao kĩ năng, phương pháp, vận dụng vào việc lập trình giải số toán cách hiệu w n lo Hướng phát triển đề tài ad th Trong thời gian tới tập trung phát triển đề tài nữa, xây dựng lại hệ thống lý thuyết cách chặt chẽ kết hợp với số tập dạng khác nhau, hợp lý Đồng thời xây dựng chỉnh sửa lại, mở rộng nội dung, dễ triển, thân thiện Nhằm mang lại nhiều kết cao kì thi học sinh giỏi thi vào lớp 10 chuyên tin Tỉnh yj uy ip la an lu Ngoài chia đề tài cách rộng rãi đến giáo viên nhà trường Giúp giáo viên bồi dưỡng có thêm lựa chọn nội dung, phương pháp việc ôn tập bồi dưỡng học sinh giỏi cấp trường, cấp huyện, cấp tỉnh, tin học trẻ củng thi vào lớp 10 chuyên tin Tỉnh cách dễ dàng hiệu n va fu ll Đề tài áp dụng vào việc bồi dưỡng, ôn thi học sinh giỏi hổ trợ cho giáo viên làm tài liệu đạt số giải cao việc thi học sinh giỏi tỉnh năm học 2016-2017 giải bảng B, năm 2018-2019 nhì Bảng B đạt khuyến khích Tin học trẻ, năm học 2021-2022 giải nhì bảng B oi m at nh z z Kiến nghị đề xuất vb k jm ht Để áp dụng đề tài hiệu trình bồi dưỡng giáo viên cần bồi dưỡng nhiều lí thuyết thuật tốn tìm kiếm nhị phân Xem làm toán từ bản, điển hình nâng cao Ngồi cần kết hợp thuật tốn tìm kiếm nhị phân kết hợp số phương pháp khác cấu trúc liệu khác để đem lại hiệu dạng tập m 50 co Do thời gian lực cá nhân hạn chế, nên đề tài cịn có số thiếu sót, xây dựng nội dung, phương pháp cách thức đáp ứng yêu cầu đề tài đưa Chính mong nhận lời góp ý, nhận xét từ Ban Giám khảo, bạn đồng nghiệp để phát huy mặt mạnh, điều chỉnh, khắc phục thiếu sót cho đề tài hồn thiện Lời cuối cho phép xin chân thành cảm ơn ban giám khảo, ban giám hiệu nhà trường, đồng nghiệp, em học sinh địa bàn giúp đỡ tạo điều kiện để tơi hồn thành triển khai đề tài cách hiệu l gm Hướng dẫn, khuyến khích học sinh tham gia giải bài, tìm kiếm tập có phân dạng xử lí thuật tốn tìm kiếm nhị phân trang mạng giải trực tuyến đề thi học sinh giỏi, đề thi vào trường Phan qua năm

Ngày đăng: 22/08/2023, 09:22

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

Tài liệu liên quan