Skip to content

Commit

Permalink
Create 2024-09-14-이분탐색.md
Browse files Browse the repository at this point in the history
  • Loading branch information
YIM2UL2ET authored Sep 14, 2024
1 parent e78b521 commit 1c15f58
Showing 1 changed file with 125 additions and 0 deletions.
125 changes: 125 additions & 0 deletions _posts/2024-09-14-이분탐색.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
published: true
title: 이분 탐색(Binary Search), 매개변수 탐색(Parametric Search)
layout: post
date: 2024-09-14 00:21:00 +09:00
categories: [PS, 알고리즘]
tags: [PS, 알고리즘, 이분탐색, Binary Search, lower_bound, upper_bound]
math: true
---
정리가 덜 되었지만 참고용으로 빠르게 출고, 이후 수정 예정

## **이분 탐색(Binary Search)**

#### 개요 ####
탐색기법중 하나로, 배열이 정렬되어 있을 때 사용할 수 있다. 시간복잡도는 $O(logN)$이다.<br>

#### 의사코드 ####
```cpp
left = 0, right = N; // 1. 범위를 정한다.
while (left <= right) {
mid = (left + right) // 2. 중앙 위치를 탐색

if (target < mid) // 3. 결정문에 따라 위치를 반환하거나, 범위를 절반으로 조정
right = mid - 1;
else if (target > mid)
left = mid + 1;
else
return mid; // 값을 찾았으면 return, 못 찾았으면 범위를 절반으로 줄임
}

return -1;
```

#### STL ####
해당 알고리즘은 <algorithm> 헤더에 구현되어 있다. 시간복잡도는 $O(logN)$

주의점은 배열은 반드시 오름차순으로 정렬되어 있어야 한다. 또한 반환값은 bool형이다.
```cpp
binary_search(vec.begin(), vec.end(), target);
// target이 있으면 true, 없다면 false를 반환한다.
```
[binary_search](https://learn.microsoft.com/ko-kr/cpp/standard-library/algorithm-functions?view=msvc-170#binary_search)
## **매개변수 탐색(Parametric Search)**
#### 개요 ####
이분탐색(Binary Search)와 비슷한 탐색법이다. 둘의 가장 큰 차이점은 다음과 같다.
- 이분탐색은 목표값이 존재하는지, 어느 위치에 있는지 찾는 것을 초점으로 한다.
- 매개변수 탐색은 조건에 가장 근접하는 값을 찾는 것을 초점으로 한다.
// 나중에 추가 예정
## **upper_bound와 lower_bound**
#### 개요 ####
매개변수 탐색에서 응용할 수 있는 알고리즘이다.
배열이 오름차순으로 정렬되어 있다고 가정하여 사용했을 때, 두 알고리즘의 차이점은 다음과 같다.
- upper_bound는 배열에서 목표값을 **초과하는 값** 중에서 가장 좌측에 위치한 값을 찾는 알고리즘이다.
- lower_bound는 배열에서 목표값과 **같거나 큰 값** 중에서 가장 좌측에 위치한 값을 찾는 알고리즘이다.
#### 구현 ####
```cpp
int upper_bound(int target, vector<int> &v) {
int left = 0, right = v.size() - 1;
while (left < right) {
int mid = (left + right) / 2;
if (target <= v[mid]) { // 해당 부분이 다르다
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
```
```cpp
int lower_bound(int target, vector<int> &v {
int left = 0, right = v.size() - 1;

while (left < right) { // 해당 부분이 다르다
int mid = (left + right) / 2;

if (target < v[mid]) {
left = mid + 1;
} else {
right = mid;
}
}

return right;
}
```
#### STL ####
해당 알고리즘은 <algorithm> 헤더에 구현되어 있다. 시간복잡도는 $O(logN)$
사용시 주의점은 매개변수로 사용하는 배열은 반드시 오름차순으로 정렬되어 있어야 한다.
```cpp
auto lower = lower_bound(vec.begin(), vec.end(), key);
// iterator 형태로 lower에 저장된다.
auto upper = upper_bound(vec.begin(), vec.end(), key);
// iterator 형태로 upper에 저장된다.
```

[lower_bound](https://learn.microsoft.com/ko-kr/cpp/standard-library/algorithm-functions?view=msvc-170#lower_bound)<br>
[upper_bound](https://learn.microsoft.com/ko-kr/cpp/standard-library/algorithm-functions?view=msvc-170#upper_bound)


## **예제**
- [BOJ 1654 - 랜선 자르기](https://www.acmicpc.net/problem/1654) <- 가장 기초적인 문제
- [BOJ 1300 - K번째 수](https://www.acmicpc.net/problem/1300) <- 접근법 향상을 위한 문제

그 외 solved.ac 이분 탐색(binary_search) 태그 및 매개 변수 탐색(parametric_search) 태그 문제들..

## **참조**
- [[C++ Algorithm] 이분 탐색(Binary Search)](https://m42-orion.tistory.com/69)
- [[C++ Algorithm] 매개 변수 탐색(Parametric Search)](https://m42-orion.tistory.com/70)

0 comments on commit 1c15f58

Please sign in to comment.