forked from cotes2020/jekyll-theme-chirpy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
125 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |