Programing/C, C++
#자료구조와 함께 배우는 알고리즘 입문 C언어편 - 3
CouqueD'asse
2022. 5. 10. 15:26
3장 검색
03-1 검색 알고리즘
배열 검색
1. 선형 검색 : 무작위로 늘어놓은 데이터 모임에서 검색을 수행
2. 이진 검색 : 일정한 규칙으로 늘어놓은 데이터 모임에서 아주 빠른 검색을 수행
3. 해시법 : 추가, 삭제가 자주 일어나는 데이터 모임에서 아주 빠른 검새을 수행
- 체인법 : 같은 해시 값의 데이터를 선형 리스트로 연결하는 방법
- 오픈 주소법 : 데이터를 위한 해시 값이 충돌할 때 재해시하는 방법
03-2 선형 검색
선형 검색/순차 검색
// 선형 검색
int search(const int a[], int n, int key)
{
int i = 0;
for (i = 0; i < n; i++)
{
if (a[i] == key)
{
return 1;
}
else
{
return -1;
}
}
}
int main(void)
{
int i, nx, ky, idx;
int* x;
puts("선형 검색");
printf("요소 개수 : ");
scanf_s("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
for (i = 0; i < nx; i++)
{
printf("x[%d] : ", i);
scanf_s("%d", &x[i]);
}
printf("검색 값 : ");
scanf_s("%d", &ky);
idx = search(x, nx, ky);
if (idx == -1)
{
puts("검색에 실패했습니다.");
}
else
{
printf("%d(은)는 x[%d]에 있습니다.\n", ky, idx);
}
free(x);
return 0;
}
요소가 직선 모양으로 늘어선 배열에서의 검색은 원하는 키 값을 갖는 요소를 만날 때까지 맨 앞부터 순서대로 요소를 검색
배열 검색의 종료 조건
검색할 값을 발견하지 못하고 배열의 끝을 지나간 경우
검색할 값과 같은 요소를 발견한 경우
03-3 이진 검색
이진 검색
// 이진 검색
int bin_search(const int a[], int n, int key)
{
int pl = 0;
int pr = n - 1;
int pc;
do {
pc = (pl + pr) / 2;
if(a[pc] == key)
{
return pc;
}
else if (a[pc] < key)
{
pl = pc + 1;
}
else
{
pr = pc - 1;
}
} while (pl <= pr);
return -1;
}
int main(void)
{
int i, nx, ky, idx;
int* x;
puts("이진 검색");
printf("요소 개수 : ");
scanf_s("%d", &nx);
x = (int*)calloc(nx, sizeof(int));
printf("오름차순으로 입력하세요.\n");
printf("x[0] : ");
scanf_s("%d", &x[0]);
for (i = 1; i < nx; i++)
{
do {
printf("x[%d] : ", i);
scanf_s("%d", &x[i]);
} while (x[i] < x[i - 1]);
}
printf("검색 값 : ");
scanf_s("%d", &ky);
idx = bin_search(x, nx, ky);
if (idx == -1)
{
puts("검색에 실패했습니다.\n");
}
else
{
printf("%d(은)는 x[%d]에 있습니다.\n", ky, idx);
}
free(x);
return 0;
}
요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색 (전제 조건 : 데이터가 키 값으로 이미 정렬상태)
복잡도
알고리즘의 성능을 객관적으로 평가하는 기준
1. 시간 복잡도 : 실행에 필요한 시간을 평가
2. 공간 복잡도 : 기억 영역과 파일 공간이 얼마나 필요한가를 평가
bsearch 함수(정렬된 배열에서 검색하는 함수)
특징 1. 검색 대상의 배열은 항상 정렬되어 있어야 함
특징 2. 검색하는 값과 같은 요소가 여러 개 존재하는 경우, 항상 가장 앞쪽에 있는 요소를 찾아내는 것은 아님
함수 포인터
// int를 받아들여 double로 반환하는 함수
double func(int);
// int를 받아들여 double을 반환하는 함수에 대한 포인터 fp의 선언
double(*fp)(int);
// int를 받아들여 double에 대한 포인터를 반환하는 함수 선언
double *fn(int);