안녕하세요 열코입니다.

이번시간에는 기본적인 검색(탐색) 알고리즘 종류들에 대해 알아보도록 하겠습니다.


1. 선형 검색 (Linear Search)

- 배열의 가장 좌측부터 시작하여 찾으려는 값과 하나씩 배열의 각 요소와 비교합니다.

- 찾으려는 값을 발견한다면 배열의 해당 인덱스를 반환(return)합니다.

- 찾으려는 값이 없다면 -1을 반환합니다.

- 시간복잡도 O(n)

- 이진 검색 및 해시 테이블과 같은 다른 검색 알고리즘이 훨씬 빠르기 때문에 실제로 거의 사용하지 않습니다.


- 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int search(int arr[], int n, int x) { // 매개변수 : 배열이름, 배열의 길이, 찾으려는 값
 
    int i;
 
    for (i = 0; i < n; i++) { // 배열 전체 순차 탐색
 
        if (arr[i] == x) { // 찾는 값 발견
 
            return i; // 해당 위치(인덱스) 반환
 
        }
 
    }
 
    return -1// 찾으려는 값을 발견하지 못하면 -1 반환
 
}
cs



2. 이진 검색 (Binary Search)

- 검색 반경을 반으로 나눠어 반복하는 검색 방법입니다.

- 정렬 된 배열에서 사용 가능합니다.

- 찾으려는 값을 배열의 중간값과 비교하여 그 값이 더 작다면 우측 배열, 크다면 좌측 배열로 이동하여 반복

- 시간 복잡도 O(log n)


- 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int binarySearch(int arr[], int l, int r, int x) { // 매개변수 : 배열이름, 배열 시작 인덱스, 배열 끝 인덱스, 찾으려는 값
 
   if (r >= l) 
 
   { 
 
        int mid = l + (r - l)/2// 중간 값 선택
 
        if (arr[mid] == x) // 비교하여 찾는 값이라면
 
            return mid; // 해당 인덱스 반환
 
 
        if (arr[mid] > x) // 찾으려는 값보다 크다면
 
            return binarySearch(arr, l, mid-1, x); // 좌측 배열 탐색
 
 
        return binarySearch(arr, mid+1, r, x); // 우측 배열 탐색
 
   }
 
   return -1;  // 찾으려는 값이 없다면 -1 반환
 
cs


- C++ STL에서는 이진 검색을 라이브러리로 제공합니다.

- binary_search(시작위치, 끝위치, 찾으려는값) 식으로 사용합니다.

- lower_bound는 찾으려는 값이 여러개 존재할 때 사용합니다. (upper_bound는 큰 인덱스를 반환)

- 배열(또는 리스트) 안에 찾으려는 값이 1개(단일) 존재한다면 해당 값의 인덱스를 반환합니다.

- 배열 안에 찾으려는 값이 2개 이상 존재한다면 해당 값 중 가장 앞쪽(낮은) 인덱스(num of first position)를 반환합니다.

- 배열 안에 찾으려는 값이 없을 경우 찾으려는 값 다음 위치의 인덱스를 반환합니다.

- 자바에서 Array.binarySearch() 또는 Collections.binarySearch()을 라이브러리로 사용할 수 있습니다.

- 만약 자바에서 이진 탐색을 사용하려면 전에 Array.sort() 메소드를 호출하여 배열을 정렬할 필요가 있습니다.




※ 배열 또는 리스트에서 최소값, 최대값 검색

- 정렬된 배열 또는 리스트에서는 양쪽 끝 값이 최소값 또는 최대값입니다.

- Divide and Conquer를 사용하여 O(log n) 시간에서 최소값 또는 최대값을 구할 수 있습니다.


- 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int findPeakUtil(int arr[], int low, int high, int n) 
 
 
    int mid = low + (high - low)/2
 
 
    if ((mid == 0 || arr[mid-1<= arr[mid]) && 
 
            (mid == n-1 || arr[mid+1<= arr[mid])) 
 
        return mid; 
 
 
    else if (mid > 0 && arr[mid-1> arr[mid]) 
 
        return findPeakUtil(arr, low, (mid -1), n); 
 
 
 
    else return findPeakUtil(arr, (mid + 1), high, n); 
 
 
 
int findPeak(int arr[], int n) 
 
 
    return findPeakUtil(arr, 0, n-1, n); 
 
cs



이상 ''에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.





'자료구조, 알고리즘' 카테고리의 다른 글

[BOJ] 8979 올림픽 - 문제 풀이  (1) 2019.03.29
정렬 알고리즘 종류  (0) 2018.09.12
자료구조 그래프(Graph)  (1) 2018.09.06
자료구조 힙(Heap)  (0) 2018.09.05
자료구조 이진 탐색 트리(Binary Search Tree)  (0) 2018.09.01
자료구조 트리(Tree)  (0) 2018.08.30
[자료구조] 큐 QUEUE  (0) 2018.08.19
[자료구조] 스택 STACK  (0) 2018.08.19

to Top