[자료구조] 이진 탐색 (binary search)CSE/자료구조 (data structure)2022. 11. 19. 00:00
Table of Contents
배열의 요소가 많지 않다면 순차 탐색이 어느 정도 충분한 탐색 방식일 수 있습니다. 그렇지만 요소가 적지 않은 배열이라면 정렬되지 않은 상태에서 탐색을 하는 것은 비효율적입니다.
따라서 정렬을 먼저 한 다음 탐색을 하는 것이 효율적입니다. 그 중 이진 탐색을 먼저 살펴보겠습니다.
이진 탐색이란?
이진 탐색은 배열의 중앙에 있는 값을 선택해 찾고자 하는 값과 비교를 통해 탐색 범위를 반으로 줄이는 탐색 기법입니다. 데이터의 양이 많을 때 사용하면 탐색 횟수를 획기적으로 줄일 수 있습니다.
이진 탐색 구현
이진 탐색의 핵심은 반으로 나누기입니다.
과정은 아래와 같습니다.
- 리스트의 가운데 있는 요소를 선택
- 선택한 요소가 찾으려고 하는 값보다
- 크면 왼쪽 리스트 탐색
- 작으면 오른쪽 리스트 탐색
- 찾으면 요소의 인덱스 return
- 탐색해야 될 항목이 없으면 탐색 실패
이진 탐색은 재귀 혹은 반복문을 이용해 구현할 수 있습니다.
int binary_search_recursion(int key, int low, int high) {
int middle;
if(low <= high) {
middle = (low + high) / 2;
if(key == list[middle]) {
return middle; // 탐색 성공
} else if (key < list[middle]) { // 왼쪽 부분 리스트 탐색
return binary_search_recursion(key, low, middle - 1);
} else { // 오른쪽 부분 리스트 탐색
return binary_search_recursion(key, middle + 1, high);
}
}
return -1;
}
int binary_search_iter(int key, int low, int high) {
int middle;
while(low <= high) {
middle = (low + high) / 2;
if(key == list[middle]) {
return middle;
} else if (key > list[middle]) {
low = middle + 1;
} else {
high = middle - 1;
}
}
return -1;
}
이진 탐색 시간복잡도
탐색을 반복할 때마다 탐색 범위를 반으로 줄입니다. 따라서 시간복잡도는 $O(log \space n)$이 됩니다.
728x90
반응형
'CSE > 자료구조 (data structure)' 카테고리의 다른 글
[자료구조] 보간 탐색 (interpolation search) (0) | 2022.11.21 |
---|---|
[자료구조] 색인 순차 탐색 (indexed sequential search) (0) | 2022.11.20 |
[자료구조] 탐색 (search) (0) | 2022.11.18 |
[자료구조] 기수 정렬 (radix sort) (0) | 2022.11.16 |
[자료구조] 힙 정렬 (heap sort) (0) | 2022.11.15 |
@junyeokk :: 나무보다 숲을
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!