jusung-c
으 하기싫어
jusung-c
  • 공부 기록 (96)
    • Spring (42)
      • Spring 기초 이론 (8)
      • Spring 핵심 원리 - 기본 (9)
      • Blog 만들기 with SpringBoot (25)
    • JAVA (7)
      • Java 문법 (2)
      • 객체지향의 사실과 오해 (5)
    • Algorithm (47)
      • 자료구조 (3)
      • 완전탐색 (22)
      • 정렬 (4)
      • 이분탐색 (12)
      • 투 포인터 (4)
hELLO · Designed By 정상우.
jusung-c

으 하기싫어

[Algorithm] 이분 탐색(Binary Search)
Algorithm/이분탐색

[Algorithm] 이분 탐색(Binary Search)

2022. 4. 19. 20:19

류호석님의 패스트캠퍼스 강의 자료를 참고하여 정리한 글입니다.

출처 : https://github.com/rhs0266/FastCampus

 

 

 

탐색

수열과 탐색 대상 x가 주어진 경우

  • x가 존재하는가?
  • x 이하 or 미만 or 이상 or 초과 하는 원소의 개수는?
  • x랑 가장 가까운 원소는 무엇인가?
  • ...

 

모든 원소를 보면서 x와 비교를 하는 경우 O(N)의 시간복잡도로 위의 질문을 대답할 수 있다.

 

그런데 만약 정렬이 된 수열이 주어진다면 어떻게 될까? 

정렬된 수열과 탐색 대상 x가 주어진 경우 이분 탐색을 이용하면 더 빠르게 위의 질문을 대답할 수 있다.

 

이분 탐색 (Binary Search)

정렬이 보장되는 배열에서 기준 x를 가지고 범위를 "이분"하면서 탐색하는 방법

 

정렬이 보장된다는 의미는 무엇일까?

  • 원소가 공개된 배열을 받아서 정렬한 경우
  • 어떤 원소를 가지고 있는 지 모르지만 정렬되어 있다는 사실을 알려준 경우

 

이분 탐색을 사용하면 시간 복잡도 O(log N)으로 해결할 수 있다.

 

 

오름차순 정렬이 된 배열의 특성

  • A[M]이 X보다 크면 A[M~마지막]은 전부 X보다 크다.
  • A[M]이 X보다 작으면 A[1~M]은 전부 X보다 작다.

 

이 특성을 이용해서 이분 탐색을 진행한다.

  • L : 탐색할 가치가 있는 범위의 왼쪽 끝 인덱스
  • R : 탐색할 가치가 있는 범위의 오른쪽 끝 인덱스
  • Result : 탐색한 X의 위치
  • 탐색 목표 : X 이하의 원소 중에 가장 오른쪽에 있는 원소

 

 

 

초기상태

 

1. M = (L+R)/2 = 3. A[M]과 X 비교 -> 15 < 29, result = 3

2. L = M+1 = 4

3. M = (L+R)/2 = 5. A[M]과 X 비교 -> 33 > 29, result = 5

4. R = M-1 = 4

3. M = (L+R)/2 = 4. A[M]과 X 비교 -> 19 < 29, result = 4

4. L = M+1 = 5

 

L > R이 되는 순간 탐색할 구간이 없어지는 것이므로 종료

 

result = 4 이므로 알 수 있는 사실들

  • A[4]는 X 보다 작은 값 중 제일 큰 값
  • A[5]은 X 보다 큰 값 중 제일 작은 값
  • X 이하의 숫자가 4개

 

시간 복잡도 계산

정렬이 되어있다는 가정 하에,

 

A[M]과 X를 한 번 비교할 때마다 탐색 구간이 절반씩 좁아진다.

 

따라서 총 비교 횟수는 구간의 변화 횟수인 O(log N)만에 이분탐색이 가능하다.

 

만약 N이 10만이라면 log(10만)은 약 16이기 때문에 매우 빠르게 탐색이 가능하다.

 

 

 

자주 하는 실수

  • 정렬을 하지 않고 이분탐색을 하는 경우
  • 부등호 실수
  • L, R 범위를 잘못 설정하거나 Result의 초기값을 설정하는 경우

 

 

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 이분탐색' 카테고리의 다른 글

BOJ 1654 - 랜선 자르기  (0) 2022.05.02
BOJ 2805 - 나무 자르기  (0) 2022.05.01
매개 변수 탐색 (Parametric Search)  (0) 2022.05.01
BOJ 2470 - 두 용액  (0) 2022.04.28
[BOJ 7795] 먹을 것인가 먹힐 것인가  (0) 2022.04.19
    'Algorithm/이분탐색' 카테고리의 다른 글
    • BOJ 2805 - 나무 자르기
    • 매개 변수 탐색 (Parametric Search)
    • BOJ 2470 - 두 용액
    • [BOJ 7795] 먹을 것인가 먹힐 것인가
    jusung-c
    jusung-c

    티스토리툴바