본문 바로가기

C++ 자료구조

[탐색] 순차 탐색, 이진 탐색

[순차 탐색 (sequential search)]

  • 탐색 방법 중에서 가장 간단하고 직접적인 탐색 방법
    - 정렬되지 않은 배열을 처음부터 마지막까지 하나씩 검사

 

  • 평균 비교 횟수
    - 탐색 성공: (n + 1) / 2번 비교
    - 탐색 실패: n번 비교

 

<순차 탐색 알고리즘>

int sequentialSearch(int list[], int key, int low, int high)
{
	for (int i = low; i <= high; i++)
    	if (list[i] == key)
        	return i;
    return -1;
}

 

- 시간 복잡도: O(n)

 

 

 

[이진 탐색 (binary search)]

  • 정렬된 배열의 탐색에 적합
    배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄여가며 탐색 진행

 

  • ex) 10억명 중에서 특정한 이름 탐색
    - 이진 탐색 : 단지 30번의 비교를 필요함
    - 순차 탐색 : 평균 5억번의 비교가 필요함

 

<이진 탐색 구현>

int binarySearch (int list[], 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; // 탐색 실패
}

 

 

[이진 탐색 vs 순차 탐색]

  • 정렬된 상태가 아니라면? 시간 복잡도를 비교해보자

 

정렬되지 않은 상태라면 이진 탐색 (Binary Search)가 더욱 효율적이다.

 

[upper_bound & lower_bound]

  • #include <algorithm>을 해줘야 사용가능
  • 이분 탐색을 기반으로 함
  • Upper_bound : 찾고자 하는 값보다 큰 값의 첫 번째 위치 주소 반환
  • Lower_bound : 찾고자 하는 값 이상의 수가 처음 나오는 위치 주소 반환
  • Upper(Lower)_bound(첫 번째 주소, 마지막 + 1 주소, 찾는 수) - 이렇게 사용해야한다.

 

 

  • 만약 upper_bound와 lower_bound의 차이가 0이라면, 찾는 수가 없는 것이다.
  • 정렬된 배열에서 특정 수의 개수를 구하기 위해서는 upper_bound와 lower_bound의 차를 통해 계산하면 된다.

 

 

[매개변수 탐색]

  • 최적화 문제를 여러 번의 결정 문제로 바꾸어서 해결하는 방법
    - 최적화 문제: 특정 조건을 만족하는 것들 중 가장 알맞은 값(최솟값, 최댓값)을 찾는 문제
    - 결정 문제: YES or NO로 답할 수 있는 문제

 

 

 

'C++ 자료구조' 카테고리의 다른 글

[c++] 트리(tree)  (0) 2024.08.12
[c++] map과 set  (0) 2024.06.11
[C++ | 연결 리스트] 스택, 큐, 리스트  (0) 2024.04.29
[c++] 큐 (Queue)  (0) 2024.04.22
[c++] 스택 (Stack)  (0) 2024.04.15