[이진 탐색]
[이진 탐색]
이진 탐색은 정렬된 데이터 집합에서 사용할 수 있는 '고속'탐색 알고리즘이다 .
이진 탐색이라는 이름은 알고리즘의 핵심이 탐색범위를 1/2 씩 줄여나가는 방식에 있기 때문에 붙여졌다 .
[과정]
- 데이터 집합의 중앙에 있는 요소를 고른다 .
- 중앙요소의 값과 찾고자 하는 목표값을 비교한다
- 목표값과 중앙요소의 값을 비교해 목표값이 중앙요소가 작다면 왼편,크다면 오른편에 대한 이진검색을 수행한다
- 찾고자 하는 값을 찾을때까지 위의 과정을 반복한다 .
[성능]
이진 탐색은 참색을 시도할때마다 탐색의 범위가 1/2씩 줄어들어 결국은 1이 된다 . 1의 경우 (마지막 데이터 범위)를
식으로 나타내자면 1 = n * (1/2)x제곱이며 이를 단순화 한다면 x = log2n으로 나타낼수 있다 .
=>이는 데이터 집합의 크기가 아무리 크더라도 탐색 소요 시간은 미미하게 증가함을 나타낸다
ex)100만개는 20회 , 1000만개는 23회의 탐색을 반복하면 찾을 수 있다 .
[ 구현 ]
구현은 다음과 같다 .
ElementType BinarySearch(ElementType DataSet[] , int size , ElementType Target)
{
int Left = 0;
int Right = size-1;
int Mid=0;
//탐색 범위가 0이 될때 까지
while(Left <= Right)
{
Mid = (Left+Right)/2;
if(Target == DataSet[Mid]
return DataSet[Mid]
else if(Target>DataSet[Mid]
Left=Mid+1;
else
Right=Mid-1;
}
return NULL;
}
[ c 표준 라이브러리의 이진 탐색 함수 : bserch()]
[bsearch]
표준 라이브러리가 퀵 정렬을 구현한것과 같이 이진 탐색을 구현한 bsarch()도 존재한다 .
원형은 다음과 같다 .
void * bsearch
{
const void *key, //찾고자 하는 목표값 데이터의 주소
const void *base, //데이터 집합 배열의 주소
size_t num, //데이터 요소의 개수
size_t width, //한 데이터 요소의 크기
int (__cdecl *compare)(const void* , const void*)//비교 함수에 대한 포인터
};
'자료구조' 카테고리의 다른 글
[ 자료구조 ] 탐색 - 04 - 1 . 레드 블랙 트리 <회전 , 삽입> (0) | 2023.03.07 |
---|---|
[ 자료구조 ] 탐색 - 03 . 이진 탐색 트리 (0) | 2023.03.07 |
[ 자료구조 ] 탐색 - 01 . 순차탐색 (0) | 2023.03.02 |
[ 자료구조 ] 정렬 - 05 . qsort (0) | 2023.02.18 |
[ 자료구조 ] 정렬 - 04 . 퀵 정렬 (0) | 2023.02.17 |