tony9402

2. Search algorithm 본문

알고리즘/공부

2. Search algorithm

ssu_gongdoli 2018. 9. 16. 22:26
반응형



Search algorithm을 보기 전에 시간 복잡도에 대한 계산을 어떻게 하는지 알아야 한다.


시간 복잡도를 계산할 때, Worst case, Best case 인 경우를 구하면 된다.

Worse case는 말 그대로 최악의 상황일 때 시간 복잡도를 계산하면 되고

Best case는 상황이 가장 좋을 때 시간 복잡도를 계산하면 된다.




Search algorithm


검색(찾기) 알고리즘

(한국말로 하니깐 뭔가 어색하다)


Searching 하는 알고리즘에는 기본적으로 Binary Search, Sequential Search가 있다.






1. Sequential Search(순차 검색)




아래는 Sequential Search에 대한 Pseudo-code 이다.


1
2
3
4
5
6
7
8
void Seqsearch(int n, const keytype S[], keytype x, index& location){
    location = 1;
    while(location <= n && S[location] != x)
        location ++;
    if(location > n)
        location = 0;
}
 

cs











이 알고리즘은 처음부터 끝까지 단계적으로 지나가면서 우리가 찾고자 하는 숫자를 검색한다.


이 알고리즘은 input size가 크든 작든 Best case(B.C)가 항상 1이다.


예를 들어 배열 [3,4,9,1,8,2]이 있다고 하고 우리가 찾을 숫자를 3이라 가정하면 인덱스가 0, 즉 맨 앞에 1이 있기 때문에 한번에 검색을 완료 하였다.


Worst Case(W.C)는 B.C와 반대로 우리가 찾고자 하는 숫자가 맨 뒤에 있으면 된다.


위에서 예를 들었던 거에서 숫자 2를 찾으려 하면 처음부터 6개의 인덱스를 모두 돌아야 찾을 수 있다.

input size에 따라 시간 복잡도가 어떻게 되는지 확인해보자.





Input size 

Count 

 1

 1 

 2

 2 

 3

 3 

 4

 4 

 5

 5

 6

 6 

 7

 7

 8

 8



이 표를 보면 input size가 커지는 비율과 동일하게 Count도 커지고 있다. 


input data가 n이라 하면 Count의 값은 n이 된다. 이를 함수화 하면 T(n) = n이다.

즉, 최악의 경우(W.C)일 때 시간복잡도는 T(n) = n이 된다. 이 때, (T(n)을 count of basic operation 이라 부른다.)



B.C : T(n) = 1

W.C : T(n) = n






2. Binary Search (이분 탐색)


아래는 Binary Search에 대한 Pseudo-code 이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
void binarySearch(int n, const keytype S[], keytype x, index& location)
{
    index low, high;
    low = 1; high = n;
    location = 0;
 
    while(low <= high && location == 0){
        mid = (low + high) / 2;
        if(x == S[mid])location = mid;
        else if(x < S[mid]) high = mid - 1;
        else low = mid + 1;
    }
}
 

cs



Sequential Search와 다르게 Binary Search는 사용 조건이 있다. 배열이 무조건 정렬이 되어 있어야 한다. 정렬이 안되어 있으면 binary search을 할 수 없다.




Binary Search에서 B.C는 어떤 상황인지 바로 한눈에 보인다.

배열 [1,2,4,6,19,25,30]에서 6을 Binary Search로 찾으면 한번 만에 찾을 수 있다. ( ∵ T(n) = 1 )

W.C를 찾는 것은 한 눈에 안 보인다. Binary Search는 반을 쪼개가면서 검색을 하는 알고리즘이다. 따라서, Binary Search에서 W.C는 찾으려는 숫자가 맨 처음에 있거나 맨 마지막에 있을때이다. 또 다른 하나가 있는데 그것은 바로, 우리가 찾을려는 숫자가 배열 안에 없을 때이다.


W.C 경우 T(n)을 구하는 것은 좀 어렵다. Binary는 반을 쪼개가면서(다른 말로는 처음과 마지막을 반으로 나누면서) 검색을 한다. 숫자 일일이 계산해서 표로 작성을 하면 아래와 같다.



Input size 

Count 

 1

 1 

 2

 2 

 3

 2

 4

 3 

 5

 3

 7

 3 

 8

 4 

 9

 4 

 16

 5 


2, 4, 8, 16일 때 값이 하나씩 커진다. 이를 보고 T(n)을 유추하면 아래와 같다.





저기 있는 lg n은 밑이 2인 log n인데 보통 생략하고 저렇게 쓴다고 한다. 그 이유는 아직 모르겠지만 더 공부하다 보면 왜 저렇게 생략하는지 알게 될거 같다.


또한 log n 양 옆에 붙은 기호는 소수점 내림이라고 생각하면 된다. 예를 들어 3.141592라는 숫자를 저 기호를 이용하여 표현하면 그 값은 3이 된다.






반응형
Comments