Các hàm lower_bound; upper_bound

Một phần của tài liệu (SKKN mới NHẤT) sử dụng cấu trúc dữ liệu set, map, pair và một số hàm trong c++ trong bồi dưỡng học sinh giỏi cho bài toán tìm kiếm, sắp xếp với độ phức tạp o(n) hoặc o(logn) (Trang 44 - 49)

PHẦN I ĐẶT VẤN ĐỀ

3. Nội dung

3.4. Các hàm lower_bound; upper_bound

Chúng ta nói đến tìm kiếm gồm tìm kiếm tuyến tính và tìm kiếm nhị phân. Trong C++ chúng ta sử dụng một hàm có sẵn để tìm kiếm giá trị và trả về con trỏ vị trí cần tìm gồm hàm lower_bound; upper_bound. Lưu ý các phần tử trong mảng đã sắp xếp

a, Hàm lower

Hàm lower_bound là một hàm thành viên trong class std::map, có tác dụng tìm vị trí phần tử đầu tiên trong map có khóa lớn hơn hoặc bằng với khóa chỉ định. Áp dụng cho bài toán sắp sếp tăng dần theo một tiêu chí nào đó.Chúng ta sử dụng hàm lower_bound trong C++ với cú pháp sau đây:

mp.lower_bound(key);

Trong đó key là khóa của phần tử cần tìm trong map mp.

Hàm lower_bound() sẽ trả về vị trí phần tử đầu tiên có khóa lớn hơn hoặc bằng với khóa chỉ định. Và nếu không tìm thấy, hàm sẽ trả về trình lặp trỏ đến vị trí cuối cùng trong map.

Và trong trường hợp chỉ có một phần tử trong map có khóa giống với khóa chỉ định thì hàm lower_bound sẽ trả về con trỏ chỉ đến phần tử đó.

Cho dãy a sắp xếp tang dần: a1≤ a2≤ a3≤….≤an

lower_bound(a+l,a+r+1,x) cho ra vị trị con trỏ mà tạ đó giá trị nhỏ nhất ≥ x trong đoạn từ a[l] đến a[r]

Ví dụ: cho dãy số nguyên gồm N phần tử và 1 số nguyên k. Đưa ra vị trí đầu tiên có giá trị nhỏ nhất giá trị lớn nhất ≥k.

IN PUT OUT PUT

10 5

5 1 3 5 11 17 14 9 12 18

3

Chương trình

#include <bits/stdc++.h> #define N int (1e5) using namespace std; int a[N+5]; int n,k; int main() { freopen("sub.inp","r",stdin); freopen("sub.out","w",stdout); cin>>n>>k;

for(int i=1; i<=n;i++) cin>>a[i];

sort(a+1,a+n+1);

int p=lower_bound(a+1,a+n+1,k)-a; cout<<p;

b, Hàm upper_bound

Ngược với hàm lower_bound chính là hàm upper_bound trong C++.

Hàm upper_bound là một hàm thành viên trong class std::map, có tác dụng tìm vị trí phần tử đầu tiên trong map có khóa lớn hơn khóa chỉ định.

Chúng ta sử dụng hàm upper_bound trong C++ với cú pháp sau đây: mp.upper_bound(key);

Cho dãy a sắp xếp tang dần: a1≤ a2≤ a3≤….≤an

upper_bound (a+l,a+r+1,x) cho ra vị trị con trỏ mà tại đó giá trị nhỏ nhất > x trong đoạn từ a[l] đến a[r]

Trong đó key là khóa của phần tử cần tìm trong map mp.

Ví dụ: cho dãy số nguyên gồm N phần tử và 1 số nguyên k. Đưa ra vị trí có giá trị nhỏ nhất >k.

IN PUT OUT PUT

10 5

5 1 3 5 11 17 14 9 12 18

5

Chương trình

#include <bits/stdc++.h> #define N int (1e5) using namespace std; int a[N+5]; int n,k; int main() { freopen("sub.inp","r",stdin); freopen("sub.out","w",stdout); cin>>n>>k;

for(int i=1; i<=n;i++) cin>>a[i];

sort(a+1,a+n+1);

int p= upper_bound (a+1,a+n+1,k)-a; cout<<p;

}

Như vậy với các bài toán sắp xếp mảng yêu cầu tìm giá trị lớn hơn, bé hơn hoặc bằng ta có thể sử dụng hàm upper_bound hoặc lower_bound.

4. Áp dụng dạy thực nghiệm

Bản thân chúng tôi và các đồng nghiệp trong trường tôi đã áp dụng vào dạy trong bồi dưỡng học sinh giỏi cấp trường và cấp tỉnh năm học 2020-2021 và năm học 2021-2022.

5. Kết quả áp dụng thực nghiệm

Năm học 2021-2022 tôi bồi dưỡng đội tuyển học sinh giỏi tỉnh. Theo quy định môn tin khối THPT mỗi trường chỉ được 1 thí sinh dự thi. Tuy nhiên tôi đã mạnh dạn đề xuất 2 em tham gia dự thi học sinh giỏi cấp tỉnh và cả 2 em cùng đạt kết quả. Trong đó có 1 em đạt giải nhì học sinh giỏi với số điểm 17/20.

PHẦN III. KẾT LUẬN 1. Kết luận

Với dạng toán sắp xếp và tìm kiếm cho bài toán dãy con liên tiếp học sinh đã xử lý được bài toán với kiểu dữ liệu lớn từ 104 và đạt được tối ưu bài toán với thời gian 1 giây.

Nội dung của đề tài là tập hợp lớp các bài toán tìm kiếm và sắp xếp lập trình bằng ngôn ngữ C++ mà tác giả đã tích lũy được trong nhiều năm giảng dạy.

Đề tài này đã được áp dụng giảng dạy trong bồi dưỡng học sinh giỏi trường và học sinh giỏi tỉnh vừa qua tại trường THPT Đô Lương 1; đồng thời cũng chia sẻ, trao đổi với một số giáo viên các trường THPT của tỉnh Nghệ An và đã thu được kết quả tốt. Các em học sinh học tập tích cực hơn, hứng thú hơn và đạt kết quả cao trong học tập cũng như trong các kỳ thi HSG môn Tin học tỉnh Nghệ An năm học 2021-2022 với 2 em đạt giải trong đó 1 giải nhì với 17 điểm và 1 giải khuyến khích 12.5.

2. Đề xuất phạm vi

Áp dụng trong dạy học đội tuyển học sinh giỏi trường và tỉnh cho bậc trung học cơ sở và trung học phổ thông. Là tài liệu cho giáo viên dạy tin học tham khảo trong bồi dưỡng đội tuyển.

Chúng tôi xin cam đoan đây là sáng kiến kinh nghiệm của bản thân hai chúng tôi viết, không sao chép nội dung của người khác.

Một phần của tài liệu (SKKN mới NHẤT) sử dụng cấu trúc dữ liệu set, map, pair và một số hàm trong c++ trong bồi dưỡng học sinh giỏi cho bài toán tìm kiếm, sắp xếp với độ phức tạp o(n) hoặc o(logn) (Trang 44 - 49)

Tải bản đầy đủ (PDF)

(49 trang)