tony9402
2. Search algorithm 본문
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이 된다.
'알고리즘 > 공부' 카테고리의 다른 글
4. 차수 표기법 및 차수에 대한 정의 (0) | 2018.09.26 |
---|---|
3. 피보나치 수열의 시간 복잡도 (0) | 2018.09.26 |
1. 알고리즘이란 (0) | 2018.09.16 |
2. 시간복잡도와 공간복잡도 (1) (0) | 2018.08.26 |
1. 자료구조 기본 개념 (0) | 2018.08.26 |