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
- Dinosaur
- OCR
- 자료구조
- typeORM
- Python
- GIT
- TypeScript
- react
- 게임
- 공룡게임
- Queue
- dfs
- Sequelize
- flask
- Express
- jest
- cookie
- nestjs
- class
- Nest.js
- Bull
- game
- MySQL
- 정렬
- MongoDB
- JavaScript
- AWS
- nodejs
- mongoose
Archives
- Today
- Total
포시코딩
이진 탐색(Binary Search), 시간 복잡도 O(log N) 본문
728x90
2진 탐색
인덱스가 0부터 16까지 있는 array가 있을 때
그 중 정답이 target인 값을 찾으려면 어떻게 해야할까?
for문을 통해 처음부터 하나씩 비교하는 방법이 있겠지만
맨 마지막에 정답이 있으면 O(N) 만큼의 시간 복잡도가 걸리게 될 것이다.
이 때, 2진 탐색이라는 방법을 통해 시도 횟수를 확 낮출 수 있다.
딱 가운데 위치하는 값을 정답과 비교해서 정답이 더 크다면
가운데 위치하는 값 이하의 인덱스를 모두 버리고
정답이 더 작다면
가운데 위치하는 값 이상의 인덱스를 모두 버리는 식으로 구하며 이를 반복하면 된다.
이는 알고리즘 문제에서 UP & DOWN 문제로도 자주 나오는 형태이다. 문제풀이 예시
시간 복잡도 O(log N)
총 숫자가 1 ~ N 까지라고 한다면
1번 탐색하면 반절이 줄어드니 N/2개가 남는다.
2번 탐색하면 반절이 또 줄어드니 N/4 = N/22개가 남는다.
3번 탐색하면 반절이 또 줄어드니 N/8 = N/23개가 남는다.
...
K번 탐색하면 반절이 또 줄어드니 N/2k개가 남는다.
이 때, 이진 탐색을 통해 남은게 딱 1개라고 가정해보자
이걸 수식으로 표현하면 N/2k = 1 이다.
즉, k = log2N 횟수를 시도하면 정답을 찾을 수 있는 것이다.
정리
- 결론적으로 이진 탐색을 위해서는 시간 복잡도가 O(log N) 만큼 걸린다고 볼 수 있겠다. (상수는 버리고)
헷갈린다면 연산량이 반으로 나눠진다 싶을 때 시간 복잡도가 O(log N)이겠구나 라고 생각하면 된다. - 이진 탐색은 일정한 규칙으로 정렬되어 있는 데이터일 때만 사용이 가능하다.
이진 탐색을 위해선 정렬이 필요한데 정렬에 대해서는 따로 포스팅할 예정이다.
728x90
'자료구조알고리즘 > 이론' 카테고리의 다른 글
버블 정렬 (Bubble Sort) (0) | 2022.11.24 |
---|---|
재귀 함수 - 팩토리얼!, 회문 검사 (0) | 2022.11.24 |
Linked List 구현 using class in Python (2) (0) | 2022.11.23 |
Linked List 구현 using class in Python (1) (0) | 2022.11.23 |
Array(어레이), Linked List(링크드리스트) (0) | 2022.11.23 |