티스토리 뷰
검색에 대한 알고리즘 중 선형검색과 이진검색에 대하여 알아보도록 하겠습니다.
선형 검색(Linear Search)
다른이름으로 순차 검색(Sequential Search) 이라고도 하는 선형검색에 대하여 먼저 알아보겠습니다.
선형 검색은 데이터가 모인 집합(배열, 링크드리스트 등)의 처음부터 끝까지 하나씩 순서대로 비교하며 원하는 값을 찾아내는 알고리즘입니다.
→ 순차적으로 검색
3 |
5 |
2 |
1 |
0 |
9 |
7 |
8 |
6 |
4 |
데이터를 정렬하거나 따로 건드릴 필요가 없고, 난이도가 쉬운 편이나, 데이터의 양이 많아지면 검색에 소요되는 시간도 비례하여 많아지고, 하나씩 일일이 비교하기 때문에 비효율적이라는 단점이 있습니다. 예를들어 위와 같은 데이터의 집합이 있을경우 4를 찾으려면 10번의 비교를 거쳐야 합니다. 100만개의 데이터가 있고 찾고자 하는 데이터가 100만번째에 있다면 100만번의 비교를 해야 한다는 뜻 입니다. 이와 같은 상황을 Worst Case라고 합니다. 관련된 용어로 평균적인 상황을 Average Case 좋은 상황을 Best Case라고 합니다.
코드를 통하여 살펴보도록 하겠습니다.
1 2 3 4 5 6 7 | int LinearSearch(int arr[], int size, int target) { for(int i = 0; i < size; i++) if(arr[i] == target) //arr이라는 배열에서 target을 찾는다. return i; //찾으면 해당 방번호를 리턴 return -1; //못찾으면 -1을 리턴 } | cs |
이진검색(Binary Search)
이진검색은 다른말로 이분(二分)검색이라고도 합니다. 반으로 나누어서 연산하기 때문이죠. 선형검색의 경우 데이터 집합의 처음에서 시작하여 끝까지 탐색하는 알고리즘 이지만 이진검색은 중간값부터 탐색을 합니다. 선형검색은 링크드리스트에서 자주 쓰이는 반면에 이진검색은 트리구조에서 자주 쓰이는 형식입니다.
이진검색은 데이터를 계속 반으로 나누면서 연산하기 때문에 처리속도가 매우 빠르다는 장점을 가지고 있습니다. 그러나 이진검색을 하기 위해서 데이터의 집합이 반드시 정렬(Sort)되어야 한다는 단점이 있습니다. 이렇게 이야기하면 얼마나 빠른지 감이 잘 안올텐데, 예를들어 70억명의 사람중 한사람을 찾으려고 한다면, 선형검색은 Worst Case의 경우 70억번, 대략적으로 생각해도 35억번은 비교연산을 해야 하는데, 이진 검색은 최대 33번의 비교만으로도 원하는 데이터를 찾을 수 있습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
선형검색과 마찬가지로 10개의 방에 0부터 9까지의 데이터가 담겨 있는 배열입니다. 이야기 했다시피 이진검색의 조건은 데이터가 정렬이 되어있어야 된다는 점이기 때문에, 정렬을 진행했다 가정하고 0부터 9까지 순차적으로 적었습니다. 9라는 데이터를 찾기위해 어떤 연산과정을 거치는지 한번 알아보도록 하겠습니다.
일단 선택된 중간값인 5와 타겟인 9의 값을 비교합니다. 9가 더 큰 숫자이기 때문에 오른쪽으로 진행됩니다. 5보다 작은수인 0부터 4까지는 비교연산을 할 필요가 없습니다. 이제 5부터 9까지의 중간값을 다시 선택합니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
선택된 중간값인 8과 9를 다시 비교합니다. 9가 더 큰수이니 다시 왼쪽 숫자들은 무시되고 남은 한칸에 9가 있다는 것을 알 수 있습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
코드를 통하여 살펴보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | int BinarySearch(int arr[], int size, int target) { int first = 0; int last = n - 1; int mid; while(first <= last) { mid = (first + last) / 2; if(target == arr[mid]) return mid; else if(target < arr[mid]) last = mid-1; else first = mid + 1; } return -1; } | cs |
선형검색과 이진검색에 대하여 알아보았습니다. 도움이 되셨다면 좋겠습니다.
'C,C++' 카테고리의 다른 글
정렬(Sort) : 빠른정렬, 퀵 소트(Quick Sort) (0) | 2016.03.29 |
---|---|
자료구조 : 재귀함수(Recursive Function) (0) | 2016.03.28 |
정렬(Sort) : 선택정렬(Selection Sort) (0) | 2016.03.11 |
정렬(Sort) : 삽입정렬(Insertion Sort) (5) | 2016.03.11 |
데이터 캡슐화, 하이딩, 은닉기법 (0) | 2016.03.10 |
- Total
- Today
- Yesterday
- 악보
- 파이썬예제
- MFC
- 자료구조
- Sort
- 티라노 시그널
- 유즈케이스
- 정렬
- C++
- 클래스
- 쓰레드
- 소켓 프로그래밍
- 티그널
- 터미널
- 디렉터리
- 파일
- 데이터베이스
- 파이썬
- 액터
- C
- 라즈베리파이
- 소켓
- 스레드
- 리눅스
- 클라이언트
- socket
- UML
- C/C++
- 안드로이드
- 프로세스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |