[알고리즘] 이진탐색 (binary search)
이진 탐색은 중앙 값을 찾고 찾고자 하는 항목이 왼쪽에 있는지 오른쪽에 있는지 알아내어 탐색 범위를 반씩 줄여나간다.
비교가 이루어 질 때마다 탐색 범위가 급격하게 졸어들기 때문에 정렬된 배열을 탐색할 때는 이진탐색이 빠르다.
데이터의 삽입이나 삭제가 빈번할 경우에는 적합하지 않다.
의사코드
binary_search(list, low, high):
middle <- low에서 high사이의 중간 위치
if(탐색값 == list[middle])
return middle;
else if(탐색값 < list[middle])
return list[0]부터 list[middle-1]에서의 탐색;
else if(탐색값 > list[middle])
return list[middle+1]부터 list[high]에서의 탐색;
구현 방법에는 순환 호출과 반복 두가지가 있다.
순환 호출
int binary_search(int key, int low, int high)
{
int mid;
if(low <= high) {
mid = (low + high) / 2;
if(key == list[mid]) //탐색성공
return mid;
else if(key < list[mid]) //왼쪽 부분 리스트 탐색
return binary_search(key, low, mid - 1);
else //오른쪽 부분 리스트 탐색
return binary_search(key, mid + 1, high);
}
return -1; //탐색 실패
}
반복
int binary_search(int key, int low, int high)
{
int mid;
while(low <= high) {
mid - (low + high) / 2;
if(key == list[mid])
return mid;
else if(key > list[mid]) //오른쪽부분탐색
low = mid + 1;
else //왼쪽부분탐색
high = mid - 1;
}
return -1;
}
'공부기록 > 알고리즘' 카테고리의 다른 글
[알고리즘 / Java] 최단 경로 구하기 - 다익스트라 알고리즘 (Dijkstra) (0) | 2024.03.02 |
---|---|
[알고리즘/Java] MST(최소 신장 트리) - Kruskal알고리즘, Prim알고리즘 (1) | 2024.02.25 |
[알고리즘/Java] BFS(너비우선탐색)과 DFS(깊이우선탐색) / Flood Fill (플러드 필) 알고리즘, 위상정렬(Topology sort) (0) | 2024.02.25 |
[알고리즘/Java] 바이너리 카운팅을 이용한 부분집합 구하기 (0) | 2024.02.25 |
[알고리즘/Java] 순열과 조합 (0) | 2024.02.25 |