728x90
728x90
lower_bound(), upper_bound() ; 이진 탐색(Binary Search)
소개
- 이진 탐색(Binary Search)으로 원소를 탐색하는 함수
- 시간 복잡도가 $O(\log_{2} N)$ 으로, 빠른 속도로 탐색을 수행할 수 있다.
- 탐색을 진행할 컨테이너는 반드시 오름차순으로 정렬되어 있어야 한다.
필요한 헤더
#include <algorithm>
형식
- 찾은 값(val)의 주소를 Iterator 형으로 반환한다.
lower_bound(ForwardIterator first, ForwardIterator last, const T& val)
lower_bound(ForwardIterator first, ForwardIterator last, const T& val)
lower_bound()
- 찾으려는 키 값보다 크거나 같은(이상, ≥) 숫자가 컨테이너에서 처음 등장하는 주소를 Iterator 형으로 반환한다.
사용 예
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> V = { 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
int main() {
cout << "lower_bound(6) : " << lower_bound(V.begin(), V.end(), 6) - V.begin() << endl;
return 0;
}
lower_bound(6) : 5
- 벡터 V에서 6 이상의 숫자가 처음으로 나오는 위치(6)의 인덱스 번호는 5이다.
- lower_bound() 함수의 반환형은 Iterator로, 실제로 몇 번째 인덱스인지 확인하려면 lower_bound() 값에서 벡터의 첫 번째 주소의 위치값(V.begin())을 빼주면 된다.
- 그렇지 않을 경우 컴파일 에러가 발생한다.
upper_bound()
- 찾으려는 키 값을 초과(>)하는 숫자가 컨테이너에서 처음 등장하는 주소를 Iterator 형으로 반환한다.
사용 예
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> V = { 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
int main() {
cout << "upper_bound(7) : " << upper_bound(V.begin(), V.end(), 7) - V.begin() << endl;
return 0;
}
upper_bound(7) : 7
- 벡터 V에서 7을 초과하는 숫자(8)가 처음으로 나오는 위치의 인덱스 번호는 7이다.
- upper_bound() 함수의 반환형은 Iterator로, 실제로 몇 번째 인덱스인지 확인하려면 upper_bound() 값에서 벡터의 첫 번째 주소의 위치값(V.begin())을 빼주면 된다.
- 그렇지 않을 경우 컴파일 에러가 발생한다.
활용 방법
오름차순으로 정렬된 자료에서 특정 범위에 속하는 숫자들이 몇 개 있는지 탐색하고자 할 때
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> V = { 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9, 10 };
int main() {
cout << "2이상 4 이하의 원소 개수 : " << upper_bound(V.begin(), V.end(), 4) - lower_bound(V.begin(), V.end(), 2) << endl;
return 0;
}
2이상 4 이하의 원소 개수 : 9
- upper_bound() 값은 4를 초과하는 수(5)가 처음 등장하는 위치(인덱스 10)의 주소값을 반환하고, lower_bound() 값은 2 이상의 수(2)가 처음 등장하는 위치(인덱스 1)의 주소값을 반환한다.
오름차순으로 정렬된 자료에서 특정한 숫자가 몇 번 나오는지 탐색하고자 할 때
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> V = { 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9, 10 };
int main() {
cout << "4의 개수 : " << upper_bound(V.begin(), V.end(), 4) - lower_bound(V.begin(), V.end(), 4) << endl;
return 0;
}
4의 개수 : 4
- upper_bound() 값은 4를 초과하는 수(5)가 처음 등장하는 위치(인덱스 10)의 주소값을 반환하고, lower_bound() 값은 4 이상의 수(2)가 처음 등장하는 위치(인덱스 6)의 주소값을 반환한다.
728x90
728x90
'Programming > C++' 카테고리의 다른 글
[C++] multimap(멀티 맵) (0) | 2022.11.08 |
---|---|
[C++] unordered_map (0) | 2022.11.08 |
[C++] map(맵) (0) | 2022.11.08 |
[C++] pair(페어)와 tuple(튜플) (0) | 2022.11.03 |
[C++] sort 함수를 이용하여 오름차순/내림차순 정렬하는 방법 (0) | 2022.10.27 |
[C/C++] 현재 날짜/시간 원하는 형태로 출력하기 (0) | 2022.10.20 |
[C++] bits/stdc++.h (1) | 2022.10.18 |
[C++] 동적 할당(Dynamic Allocation) 방법 (0) | 2022.08.24 |