일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 오라클
- SQL 정리
- 자바
- 기초
- 모의해킹
- 알고리즘
- 필기
- 스프링
- 파이썬
- MySQL
- 해킹실습
- 문제풀이
- 엘라스틱서치
- 토이프로젝트
- 백준
- SQL
- 이클립스
- 스파크
- 데이터베이스
- 프로그래머스
- 위클리챌린지
- 문법
- 코딩테스트
- 데이터프로그래밍
- SQL 문법
- 스프링부트
- 프로그래밍
- 빅데이터
- c언어
- 리눅스마스터 2급 2차
- Today
- Total
개발일기
[Java Algorithm] 이분 탐색(Binaray Search) 본문
🔥 이분 탐색(Binary search)이란?
정렬되어 있는 배열에서 데이터를 찾으려 시도할 때, 순차탐색 처럼 처음부터 끝까지 하나씩 모든 데이터를 체크하여 값을 찾는 것이 아니라 탐색 범위를 절반씩 줄여가며 찾아가는 탐색방법이다.
🔥 이분 탐색 진행 단계
1. 검사 범위에서 mid값이 존재할 수 있는지 확인한다.
2. 해당 값이 찾고자 하는 값이면 반복문을 종료하며 리턴한다.
3. 만약 찾고자 하는 값이 작다면 검사범위를 큰 쪽으로 설정해야하기 때문이 left = mid를 한다.
4. 만약 찾고자 하는 값보다 크다면 검사 범위를 작은 쪽으로 잡아야 하기 때문에 right = mid를 한다.
5. 1 ~ 4번의 단계를 반복문을 통해 반복하다 원하는 값이 나오게 되면 2번 단계에서 반복문이 종료되게 된다.
🔥 이분 탐색 예시
T, F 의 값으로만 구성된 TF배열이 있다. 이때 F와 T를 정렬했을 때 F에서 T로 값이 변경되는 지점을 찾는다.
char[] TF = { 'F', 'F', 'F', 'F', 'F', 'F', 'T', 'T', 'T', 'T' };
시작지점을 배열의 맨 첫 번째 index인 0으로 선택하고 맨 끝 지점을 선언된 배열의 제일 마지막 index를 선택한다.
int start = 0;
int end = TF.length - 1;
가운데 지점을 시작지점과 끝지점을 더한 후 2로 나눈 값을 지정하고 해당 값이 F면 아직 T로 바뀐 것이 아니기 때문에 시작지점을 현재 중간지점으로 바꿔준다.
해당 값이 start + 1 이 end 보다 크거나 같게 되면 반복문을 탈출 해야하기 때문에 flag를 false로 바꿔준다.
while (flag) {
int mid = (start + end) / 2;
// start 와 end 사이에 칸이 없을 때
if (start + 1 >= end) {
flag = false;
}
if(TF[mid] == 'F') start = mid;
else end = mid;
}
🔥 시간복잡도
처음부터 끝까지 원하는 값을 찾을 때까지 탐색을 계속하는 순차탐색은 Worst Case일 때 O(n)이라는 시간 복잡도를 보여준다.
10만개이 데이터가 있다면 10만번을 탐색해야 하는 것이다.
하지만 이분 탐색은 탐색 대상을 무조건 절반씩 계속해서 줄여나가기 때문에 Worst Case일 때에도 탐색의 횟수가 10만개의 데이터가 있다고하더라도 약 16번 정도로 탐색을 끝 낼 수 있다. 여기서 이분탐색의 시간복잡도는 O(log n)이다.
'프로그래밍 이론 > Java' 카테고리의 다른 글
[Java Algorithm] 탐욕 알고리즘 (Greedy Algorithm) (0) | 2022.10.06 |
---|---|
[Java Algorithm] 스택 (Stack) / 큐 (Queue) (8) | 2022.10.05 |
JAVA 정렬 알고리즘 - Bubble Sort (2) | 2022.06.30 |
[JAVA] 코딩테스트 문법 정리 (5) - 자료구조(HashSet, HashMap) (2) | 2022.06.26 |
[JAVA] 코딩테스트 문법 정리 (4) - 자료구조(Stack, Queue, PriorityQueue) (0) | 2022.06.25 |