초코레

선형 검색(linear search) 본문

알고리즘

선형 검색(linear search)

초코레 2019. 12. 21. 23:38
  • 선형 검색(linear search) 또는 순차 검색(sequential search)
  • 배열에서 원하는 값을 가진 요소를 찾을 때까지 맨 앞에서부터 순서대로 요소를 검색하는 알고리즘
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
33
34
35
36
//선형 검색
public class SeqSearchFor {
    
    //길이가 n인 배열 a에서 key와 같은 요소를 선형 검색하여 그 요소의 인덱스를 반환한다
    private static int seqSearch(int[] a, int n, int key) {
        
            for (int i = 0; i < n; i++) {
                if (a[i] == key)
                    return i;
            }
            return -1;
    }
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
 
        System.out.print("길이 : ");
        int num = scanner.nextInt();
        int[] x = new int[num];
 
        for (int i = 0; i < num; i++) {
            System.out.print("x[" + i + "]:");
            x[i] = scanner.nextInt();
        }
 
        System.out.print("찾는 값 : ");
        int ky = scanner.nextInt();
 
        int idx = seqSearch(x, num, ky);
 
        if (idx == -1)
            System.out.println("그 값의 요소가 없습니다.");
        else
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
    }
}
cs
  • 만약 while문으로 구현하면 배열 검색의 종료 조건이 2개가 된다.
    • [조건 1] : 검색할 값을 찾지 못하고 배열의 끝을 지나간 경우
    • [조건 2] : 검색할 값과 같은 요소를 발견한 경우
1
2
3
4
5
6
7
8
9
10
11
12
private static int seqSearch(int[] a, int n, int key) {
    
    int i = 0;
    
    while (true) {
        if (i == n)
            return -1;
        if (a[i] == key)
            return i;
        i++;
    }
}
cs
  • 종료 조건을 검사하는 비용을 반으로 줄이는 방법인 보초법(sentinel method)를 적용하면 원하는 값을 찾지 못했을 때를 판단하는 종료 [조건 1]이 없어도 된다.
    • 배열의 맨 끝에 찾고자 하는 값을 저장하는 데 이 값을 보초(sentinel)라고 한다.
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
33
34
35
36
37
38
39
//선형 검색(보초법)
public class SeqSearchSen {
 
    private static int seqSearchSen(int[] a, int n, int key) {
        int i = 0;
        a[n] = key; //보초를 추가
        
        while (true) {
            if (a[i] == key)
                break;
            i++;
        }
        
        return i == n ? -1 : i;
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
 
        System.out.print("길이:");
        int num = scanner.nextInt();
        int[] x = new int[num + 1]; //보초를 넣을 길이만큼
 
        for (int i = 0; i < num; i++) {
            System.out.print("x[" + i + "]:");
            x[i] = scanner.nextInt();
        }
 
        System.out.print("검색할 값:");
        int ky = scanner.nextInt();
 
        int idx = seqSearchSen(x, num, ky);
 
        if (idx == -1)
            System.out.println("그 값의 요소가 없습니다.");
        else
            System.out.println(ky+"은(는) x[" + idx + "]에 있습니다.");
    }
}
cs

 

  • while문에서 배열에 맨 끝에 도달했는지 판단하는 것과 현재 요소와 찾고자 하는 값이 같은지 판단하는 것의 평균 실행 횟수는 n / 2 이다. n에 비례하는 횟수만큼 실행하는 경우의 복잡도는 O(n)이다.
    • 컴퓨터에게 n / 2 과 n의 차이는 크지 않다. n / 2번 실행했을 때 복잡도를 O(n/2)가 아닌 O(n)으로 표현하는 이유는 n의 값이 무한히 커진다고 가정해도 그 값의 차이가 무의미하기 때문이다. 예를 들어 100번 실행하는 경우에도 O(100)이 아닌 O(1)로 표기한다. 컴퓨터가 100번 계산하는 시간과 1번만 계산하는 시간의 차이는 사람이 느낄 수 없을 정도로 굉장히 작기 때문이다.
  • 2개 이상의 복잡도로 구성된 알고리즘의 전체 복잡도는 차원이 가장 높은 복잡도를 선택한다.

'알고리즘' 카테고리의 다른 글

스택  (0) 2019.12.23
이진 검색(binary search)  (0) 2019.12.23
기본 자료구조  (0) 2019.12.20
기본 알고리즘  (0) 2019.12.19
[알고리즘 개념정리] 퀵 정렬  (0) 2019.06.08