Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 위상 정렬(Topological Sort)
- 백준 9012번
- 백준 2261번
- BFS(Breadth First Search)
- 백준 2504번
- 동적 프로그래밍(Dynamic Programming)
- 백준 17608번
- DFS(Depth First Search)
- 백준 2812번
- 백준 21606번
- 백준 10000번
- 알고리즘 개념
- DFS
- 분할 정복(Divide and Conquer)
- 백준 2493번
- 이분 그래프(Bipartite Graph)
- 그래프(Graph)
- 백준 1948번
- 트리(Tree)
- BFS
- 백준 1707번
- 큐(Queue)
- 그리디 알고리즘(Greedy Algorithm)
- 백준 18352번
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- DFS & BFS
- 이분 탐색(Binary Search)
- 스택(Stack)
- 위상 정렬(Topology Sort)
Archives
- Today
- Total
Always Be Wise
이분 탐색(Binary Search)이란? 본문
728x90
이분 탐색이란 데이터가 정렬되어 있는 배열에서 특정한 값(X)을 찾는 알고리즘을 의미한다. X를 찾는 과정은 다음과 같다.
우선, 배열의 중간 값을 X와 비교한다. X가 해당 중간 값보다 작으면 탐색의 대상이 되는 배열을 중간 값 기준 좌측의 데이터로,
중간 값보다 크면 우측의 데이터로 조정한다. X를 찾을 때까지 이 과정을 반복한다. 이분 탐색의 시간 복잡도는 O(logN)이다.
### 직접 구현 ###
def binary_search(target, A, left, right):
if left > right:
return False
mid = (left + right) // 2
if target == A[mid]:
return True
elif target < A[mid]:
return binary_search(target, A, left, mid-1)
else:
return binary_search(target, A, mid+1, right)
### Python 내장 함수(bisect) ###
from bisect import bisect_left, bisect_right
# bisect_left(literable, value) : 왼쪽 인덱스를 구하기
# bisect_right(literable, value) : 오른쪽 인덱스를 구하기
nums = [0,1,2,3,4,5,6,7,8,9]
n = 5
print(bisect_left(nums, n)) # 5
print(bisect_right(nums, n)) # 6
## 응용 문제 : 5 ~ 7 을 갖는 요소의 개수 구하기 ##
def cal_counts(nums, left_value, right_value):
right_index = bisect_right(nums, right_value)
left_index = bisect_left(nums, left_value)
return right_index - left_index
nums = [-1, -3, 5, 5, 4, 7, 1, 7, 2, 5, 6]
nums.sort() # 이분 탐색 전 정렬은 필수
print(cal_counts(nums, 5, 7)) # 요소의 개수는 : 6
▶ 관련 링크
2021.11.17 - [알고리즘] - 이분 탐색(Binary Search)이란?
2021.11.17 - [알고리즘] - 이분 탐색 : 수 찾기(백준 1920번)
2021.11.17 - [알고리즘] - 이분 탐색 : 공유기 설치(백준 2110번)
2021.11.17 - [알고리즘] - 이분 탐색 : 나무 자르기(백준 2805번)
2021.11.17 - [알고리즘] - 이분 탐색 : 가장 긴 증가하는 부분 수열(백준 11053번)
'알고리즘 > 개념' 카테고리의 다른 글
BFS(Breadth First Search, 너비 우선 검색)이란? (0) | 2021.11.18 |
---|---|
큐(Queue)란? (0) | 2021.11.18 |
스택(Stack)이란? (0) | 2021.11.17 |
분할 정복(Divide and Conquer)이란? (0) | 2021.11.17 |
재귀 호출(Recursive Call)이란? (0) | 2021.11.17 |
Comments