728x90
반응형
이진탐색 알고리즘
- 순차 탐색 보다 훨씬 좋은 성능을 보인다.
- 배열이 정렬되어 있어야 한다는 제약이 따른다.
(당연하다. 절반씩 나누어 탐색을 나아가는 알고리즘이기때문에 정렬이 되어있어야 한다.)
- 절반씩 나누어 탐색을 나아가는 알고리즘(대소비교를 통해 왼쪽 오른쪽을 찾아나간다.)
포인트는 last에 mid -1을 해주는것과 first에 mid +1을 해주는 것이다.
first와 last가 역전될 때까지 탐색을 지속적으로 시켜주기위해서 반드시 필요한 부분이다.
이진 탐색 알고리즘 최악의 경우 시간 복잡도 구해보기
- 시간 복잡도 계산을 위한 핵심 연산은 == 연산자이다!
=> if(target == ar[mid]) 에서 ==이다.
왜냐하면 여기서 true를 반환하게되면 return mid를 실행하게 되며 함수가 종료되기 때문이다.
그래서 다른 연산자들은 ==에게 종속적일수밖에 없기 때문에 ==가 기준이다.
** 최악의 경우
데이터의 수가 n개 일경우 3을 찾을때, 근데 3이 안들어있는경우 일것이다.
n개일때 1번 ,
n/2개 일때 1번
n/4일때 1번
'
'
1개가 남을때 1번
언제까지 진행되는가?
n이 얼마인지 결정되지 않았으니 도데체 몇 번의 비교연산이 진행되는지 알 수 가 없다.
n이 1이 몇번 반으로 나눠야 하는가?
n * (1/2)k = 1
T(n) =

int BSearch(int ar[], int len, int target)
{
int first = 0; // 탐색 대상의 시작 인덱스
int last = len-1; //탐색 대상의 마지막 인덱스
int mid;
while(first <= last)
{
mid = (first + last) / 2; // 탐색 대상의 중앙을 찾는다.
if(target == ar[mid]) // 중앙에 저장된 것이 타겟이라면
{
return mid; //탐색완료!
}
else // 타겟이 아니라면 탐색 대상을 반으로 줄인다.
{
if(target < ar[mid])
{
last = mid -1; //왜 -1을 했나?
}
else
{
first = mid +1; // 왜 +1을 했나?
}
}
}
return -1; // 찾지 못했을때 -1반환
}
728x90
반응형
'프로그래밍 > 자료구조' 카테고리의 다른 글
C언어, 재귀함수로 하노이타워 구현하기 (0) | 2023.10.24 |
---|---|
함수의 재귀적 호출 (0) | 2023.10.23 |
알고리즘의 성능 분석방법 (0) | 2023.10.13 |
빅-오 표기법(Big-Oh Notation) (0) | 2023.10.11 |
열혈 자료구조 책 공부를 시작합니다. (0) | 2023.10.11 |