SKKN 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 1. Lý do chọn đề tài Môn Tin học giữ vai trò chủ đạo trong việc chuẩn bị cho học sinh khả năng tìm kiếm, tiếp nhận và mở rộng tri thức cũng như sáng tạo trong thời đại thông tin, hỗ trợ đắc lực trong quá trình học tập và tự học của học sinh. Điều đó khẳng định vai trò và vị trí quan trọng của Tin học đối với toàn xã hội. Do đó mỗi người, mỗi học sinh cần hiểu và trang bị kiến thức cơ bản về Tin học để có thể theo kịp với thời đại, với sự phát triển của xã hội. Vì vậy khi học tin thì cần trang bị kiến thức, kỹ năng lập trình để giải quyết bài toán dễ dàng hơn. Trong chương trình giáo dục phổ thông 2018 thì ngôn ngữ lập trình Python đã đưa vào dạy học từ lớp 10 năm học 20222023, Ngoài ngôn ngữ lập trình Python thì C++ là ngôn ngữ lập trình hiện nay rất phổ biến trong chương trình dạy học cũng như tính ứng dụng ngôn ngữ này rất nhiều, nhất là trong các kỳ thi tin học trẻ, thi vào chuyên tin, học sinh giỏi tỉnh… Khi giải các bài toán Tin học người lập trình luôn mong muốn viết chương trình với thuật toán tối ưu, thời gian thực hiện nhanh, bộ nhớ hạn chế…Tuy nhiên, bài toán Tin học thường đa dạng, phong phú nên để có thể tìm được thuật toán tối ưu phù hợp dữ liệu bài toán là việc không hề dễ dàng. Trong lập trình tin học đã có rất nhiều phương pháp giải các bài toán nhưng để đảm bảo thời gian, không gian là không dễ. Vì vậy lựa chọn thuật toán để tối ưu là rất quan trọng. Qua quá trình giảng dạy, học tập, tìm tòi và đặc biệt là tham gia bồi dưỡng học sinh giỏi nhiều năm qua, trong đề thi có những bài toán kích thước lớn, nếu giải bằng cách thông thường thì sẽ không tối ưu về mặt thời gian, hoặc có thể không vét hết các trường hợp xảy ra của bài toán. Tuy nhiên, nếu áp dụng phương pháp tìm kiếm nhị phân (thường gọi là chặt nhị phân) thì sẽ giải quyết tốt được tất cả các trường hợp trên. Quá trình dạy tại các lớp mũi nhọn và ôn thi HSG cấp Tỉnh, tôi đã vận dụng phương pháp tìm kiếm nhị phân để giúp các em nhìn nhận một bài toán từ nhiều góc độ khác nhau. Qua đó có thể dễ dàng nhận ra việc áp dụng phương pháp này để giải bài toán nào đó. Vì vậy, tôi đã chọn đề tài “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 . Đề tài ngoài tập trung nghiên cứu về thuật toán tìm kiếm nhị phân, đưa ra những ứng dụng của thuật toán khi giải các bài toán trên máy tính. Nhằm giúp học sinh vận dụng thuật toán này linh hoạt, giúp cải tiến về thời gian và không gian khi gặp các dạng bài toán này, cũng như các em hiểu kỹ hơn khi học chuyên đề tin 11 (Khoa học máy tính) trong năm học tới. Ngoài ra tôi cung cấp bộ test cho các bài tập giúp học sinh tự luyện code một cách hiệu quả nhất. Để cải thiện thời gian thuật toán thì cần kết hợp thuật toán tìm kiếm nhị phân với một số phương pháp 2 khác như quy hoạch động, tham lam…, cấu trúc dữ liệu set, map, hash…., để giải bài toán hiệu quả hơn. Để hoàn thành nhiệm vụ của đề tài, tôi đã nghiên cứu rất nhiều sách và các chuyên đề Tin học dành cho học sinh giỏi, các tài liệu trên các trang web. 2. Mục đích nghiên cứu Với lý do chọn đề tài đã trình bày ở trên, tôi mong muốn đề tài của mình sẽ giúp đỡ phần nào các khó khăn khi nhận dạng bài toán tìm kiếm nhị phân trong quá trình ôn luyện học sinh giỏi. Nhìn nhận, giải quyết một số bài toán bằng phương pháp tìm kiếm nhị phân. Giúp các em tiếp cận một số hàm có sẵn thư viện C++, Python Từ đó bồi dưỡng học sinh năng lực giải quyết vấn đề trong giải toán Tin học, đồng thời rèn luyện và nâng cao kĩ năng lập trình cho các em. Đặc biệt là học sinh tham gia dự thi học sinh giỏi cấp tỉnh THCS, THPT hoặc thi vào các trường chuyên 3. Đối tượng và phạm vi nghiên cứu Thuật toán tìm kiếm nhị phân. Một số bài tập thi HSG các cấp. Sự tư duy, ý thức học tập của học sinh ôn thi học sinh giỏi. Chương trình Tin học THCS, THPT để bồi dưỡng học sinh giỏi Tin học và thi vào trường chuyên THPT. 4. Phương pháp nghiên cứu Để thực hiện đề tài này, tôi đã sử dụng các phương pháp: Phương pháp nghiên cứu xây dựng cơ sở lí thuyết: Cơ sở lý thuyết là phương pháp tìm kiếm nhị phân, một số bài toán trong các đề thi các cấp; Sự hứng thú trong giờ học môn Tin học và ý thức tự học của học sinh đối với môn học. Phương pháp bồi dưỡng năng lực tự học, tư duy, giải quyết vấn đề cho học sinh Phương pháp điều tra khảo sát, thống kê, để so sánh giữa nhóm thực nghiệm và đối chứng.
SÁNG KIẾN KINH NGHIỆM 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 Năm học: 2022-2023 PHẦN I ĐẶT VẤN ĐỀ Lý chọn đề tài 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 Điều khẳng định vai trị vị trí quan trọng Tin học toàn xã hội 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 tốn dễ dàng 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… Khi giải toán Tin học người lập trình ln mong muốn viết chương trình với thuật toá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 toá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 tốn để đảm bảo thời gian, không gian không dễ Vì lựa chọn thuật tốn để tối ưu quan trọng Qua 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 toá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 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 " Đề 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 toán linh hoạt, giúp cải tiến thời gian khơng gian gặp dạng tốn này, em hiểu kỹ học chuyên đề tin 11 (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 toá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 khác quy hoạch động, tham lam…, cấu trúc liệu set, map, hash…., để giải tốn hiệu Để hồ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 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 - Nhìn nhận, giải số tốn phương pháp tìm kiếm nhị phân - Giúp em tiếp cận số hàm có sẵn thư viện C++, Python - 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 Đối tượng phạm vi nghiên cứu - Thuật tốn tìm kiếm nhị phân - Một số 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 - 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 Phương pháp nghiên cứu Để thực đề tài này, sử dụng phương pháp: - 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ố tố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 - Phương pháp bồi dưỡng lực tự học, tư duy, giải vấn đề cho học sinh - 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 Tính đóng góp đề tài - 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 PHẦN II: NỘI DUNG I Cơ sở lý luận thực tiễn Cơ sở lý luận Giới thiệu thuật toá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 toán 1.1 Thuật toán tìm kiếm nhị phân gì? 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ử 1.2 Khái niệm hàm lower_bound, upper_bound, bisect_left, bisect_right có sẵn C++ Python 1.2.1 Giới thiệu hàm lower_bound, bisect_left C++ Python - 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) - 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 Á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 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 Á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 Trong C++: kq = upper_bound(a+1, a+n+1, x) - a Trong Python: kq= bisect_right(a,x) 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 Trong C++ ta có T = upper_bound(a+1, a+n+1, x) - lower_bound(a+1,a+n+1,x) Trong Python ta có: T = bisect_right(a,x)-bisect_left(a,x) 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 Trong C++ ta có T = lower_bound(a+1, a+n+1, y) - upper_bound(a+1, a+n+1, x) Trong Python ta có T= bisect_left(a, y)-bisect_right(a,x) 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 Trong C++ ta có T = n+1 - (upper_bound(a+1, a+n+1, x) - a) Trong Python ta có T = n - (bisect_right(a, x)) 1.3 Độ phức tạp thuật tốn Thuật tố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 Cơ sở thực tiễn Nêu thực trạng vấn đề, thuận lợi, khó khăn học sinh việc giải tố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 toán tìm kiếm nhị phân vận dụng giải tố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 toá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 2.1 Đặc điểm tình hình 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, THPT học Python giúp em say mê, hứng thú, yêu thích ngơn ngữ lập trình ngày nhiều - Ngày máy tính ngày có tốc độ xử lý cao đáp ứng yêu cầu xử lý tốn có liệu lớn thời gian thực ngắn - 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… 2.1.2 Khó khăn - 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 - 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 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 tốn thực tế nói chung - 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 2.2 Thực trạng trước áp dụng đề tài - 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 toá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 - 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 II Các giải pháp giải vấn đề đề tài 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 Thuật tốn tìm kiếm nhị phân thuật toá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 q 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ử 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? Ý 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 nguyên 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 ngun phép chia + Thuật tốn lặp lại trình tìm thấy giá trị cần tìm mảng bị chia nhỏ đến mức phần tử Các bước để sử dụng thuật tốn tìm kiếm nhị phân toán sau: - Khởi tạo giá trị left right N - 1, N số phần tử dãy - 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 Cụ thể duyệt mảng a mổi giá trị j chặt nhị phân tìm g đoạn [1, i-1] cho a[i]-f[g]>=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] Độ phức tạp thuật tốn: O(nlogn) Link test tham khảo: https://drive.google.com/drive/u/0/folders/1YvsdsweQROMK8jw47AdFxCHjm6V P3VvC 37 Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 4.2 DẠNG 2: Tìm kiếm nhị phân theo kết Bài 1: Hai giá trị (ĐỀ HSG NGHỆ AN B 2018-2019) Cho dãy số nguyên gồm hai giá trị Tìm độ dài đoạn dài dãy bao Dữ liệu: Vào từ file văn TWOVALS.INP • Dịng : số ngun • Dịng : số ngun ; 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 Ý tưởng thuật tốn: Chặt nhị phân tìm kết - Kết tốn cần tìm đoạn [1, n] - 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 - 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 Độ phức tạp thuật tốn: O(nlog2n) Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 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 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 Dữ liệu: Vào từ văn DOANMAX.INP: Gồm dòng chứa chuỗi S 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ụ: DOANMAX.INP DOANMAX.OUT ABABCDAC 34 Ý tưởng thuật toán: Chặt nhị phân tìm kết - Kết tốn thuộc đoạn [1, s.length()] - 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 - 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 Độ phức tạp thuật tốn: O(nlog2s.length()) Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 40 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) 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 + 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 Input: Dòng chứa số nguyên dương n, k (n < 106; k < 109) Dòng thứ hai chứa n số nguyên a1, a2, , aN (ai < 109) 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 Input 53 37928 Output 6.500 Giải thích Đoạn cần tim 7,9,2,8 có trang bình cộng 6.500 Ý 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 Độ phức tạp thuật tốn O(nlogn) Link test tham khảo: https://drive.google.com/drive/u/0/folders/1UOfVmk5z8MwHuliU6oUeYbBbpHD im2-_ Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 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 ● Dòng thứ ba ghi số nguyên b1, b2, …, bN ((│bj│≤109) Output: File sumx out số nguyên số cặp (i, j) tìm Ví dụ: SUMX.INP SUMX.OUT 455 3142 16434 Ý tưởng thuật toán: Thuật tốn đơn giản cần duyệt vịng lặp for độ phức tạp thuật toá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 Độ phức tạp thuật toán: O(mlogn) Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 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 Yêu cầu: Cho trước giá trị k, đếm xem có xâu chứa k ký tự "1" Dữ liệu vào: - Dòng 1: Chứa số nguyên k (0 ≤ k ≤ 106) - Dịng 2: Chứa xâu nhị phân có độ dài ≤ 106 Dữ liệu ra: Ghi số nguyên kết tìm SUBSTR.INP SUBSTR.OUT 01010 Giải thích: có xâu chứa ký tự là: "101", "0101", "1010", "01010" Ý tưởng thuật toán: Sử dụng hàm lower_bound, upper_bound, bisect_left, bisect_right - Sử dụng f để tính tổng số lượng kí tự ‘1’ xâu s - 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 Độ phức tạp thuật toán: O(nlogn) Ngơn ngữ lập trình C++ Ngơn ngữ lập trình Python 44 Link test tham khảo: https://drive.google.com/drive/u/0/folders/1I4DaAYWt6gXqV36pq_Am3yFLEfV U4m2H III Khảo sát cấp thiết tính khả thi giải pháp đề xuất Mục đích khảo sát 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 toá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: - Thứ nhất, kiểm tra tính đắn đề tài - 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 - 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 - 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 Nội dung phương pháp khảo sát 2.1 Nội dung khảo sát Nội dung khảo sát tập trung vào 02 vấn đề sau: - 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ố tố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? - Các giải pháp đề xuất có khả thi học sinh học thuật tốn tìm kiếm nhị phân hay không? 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 TT Thang đánh giá Mức Không cấp thiết Ít cấp thiết Cấp thiết Rất cấp thiết Điểm trung bình X tính theo phần mềm Exel Đối tượng khảo sát 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 tơi 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 Link khảo sát: https://docs.google.com/forms/d/e/1FAIpQLScsywv4QNIllbciekjCSdmZ18e0EnH FggSS0emYNSq4EB1kWg/viewform?usp=sharing Link kết khảo sát: https://docs.google.com/forms/d/11u6aNQULFgcFusqPbkCUx_dmyFiTperwHBoRg5EpHE/edit#responses TT Đối tượng Số lượng 10A1 10A2 3 10A3 11A1 11A2 GV THPT Tổng 25 46 Kết khảo sát cấp thiết tính khả thi giải pháp 4.1 Sự cấp thiết giải pháp đề xuất Đánh giá cấp thiết giải pháp đề xuất Mức độ đánh giá TT Biện pháp Rất cấp Cấp thiết thiết Ít cấp thiết SL Điểm SL Điểm SL Điểm Không cấp thiết ∑ TB Mức SL Điểm 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 toán 21 1 84 3.36 Giải pháp 2: Phân loại 15 60 thuật toán tìm kiếm nhị phân 15 1 84 3.36 17 68 12 1 87 3.48 Giải pháp 4: Bài tập vận dụng từ đến nâng cao 18 72 12 0 90 Trung bình chung 16 64 15 3.25 6.5 0.75 0.75 86.25 3.45 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 3.6 Biểu đồ đánh giá cấp thiết giải pháp đề xuất: 47 Từ số liệu thu bảng thông qua biểu đồ rút số nhận xét sau: - 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 - Đ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 4.2 Tính khả thi giải pháp đề xuất Đánh giá tính khả thi giải pháp đề xuất Mức độ đánh giá TT Biện pháp Rất khả thi Khả thi Ít khả thi SL Điểm SL Điểm Không khả thi ∑ TB Mức SL Điểm SL Điểm 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 toán 14 56 18 1 83 3.32 Giải pháp 2: Phân loại thuật toá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 48 Biểu đồ tính khả thi giải pháp đề xuất Mối quan hệ tính cấp thiết tính khả thi Từ số liệu thu bảng thông qua biểu đồ rút số nhận xét sau: - 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, cịn 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 thiếu để hổ trợ cho giáo viên học sinh q trình ơn luyện 49 PHẦN III: KẾT LUẬN Với mục tiêu đề đề tài Đề 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 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ố tốn cách hiệu Hướng phát triển đề tài 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 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 Đề 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 Kiến nghị đề xuất Để á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 tố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 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 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 tơi 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 50