선형 구조의 탐색
이번 글은 선형 구조란 무엇이고 선형 구조 속에서 탐색하는 대표적인 방법 2가지를 설명한다.
선형 구조란?
선형 구조란 프로그래밍 언어를 배울 때 배우는 배열, 연결 리스트 같은 말 그대로 선 같이 생긴 데이터 구조를 선형 구조라고 한다.
반대로 비선형 구조는 트리, 그래프 등이 있다.

[배열] - 대표적인 선형 구조

[연결 리스트] - 얘도 선형 구조다.
선형 탐색
선형 탐색에는 대표적으로 전체 탐색과 이분 탐색(이진 탐색)이 있다.
전체 탐색은 말 그대로 전체를 순환해서 어떠한 값을 찾는 것을 말하고 이분 탐색은 정렬된 선형 구조에서 부분적으로만 탐색을 해서 값을 찾는 부분 탐색을 말한다.
구체적인 예시와 설명을 보면서 설명하면 좋을 것 같다.
전체 탐색
전체 탐색은 전체를 순환하기 때문에 시간 복잡도가 O(n)이다. 실제 코드를 보고 이해하면 될 것 같다.
이분 탐색
이분 탐색은 정렬이 되어 있는 상태에서 유용하게 사용할 수 있는데 반을 잘라서 계속 보는 것이다.
예시를 들어서 설명하겠다. 크기가 10인 배열이 있을 때(인덱스는 [0, 9]이다.)



이렇게 단 3번 만에 찾을 수 있다. 이분 탐색은 반씩 쪼개서 탐색하기 때문에 시간 복잡도가 O(log2 n)이다.
정리를 하자면 이분 탐색의 작동 원리는 이렇다. pseudo code라고 하기엔 뭐하지만 코드에 익숙해지는 것이 중요하다고 생각한다.
while (left <= right)
{
mid = (left + right) / 2;
if (array[mid] == find)
return mid;
else
{
if (array[mid] > find)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
/* | |
* if(찾으면) 위치를 출력 | |
* else -1 출력 | |
*/ | |
int BinarySearch(int* array, int left, int right, int find) | |
{ | |
while (left <= right) | |
{ | |
int mid = (left + right) / 2; | |
if (array[mid] == find) | |
return mid; | |
else { | |
if (array[mid] > find) | |
right = mid - 1; | |
else | |
left = mid + 1; | |
} | |
} | |
return -1; | |
} | |
int main() | |
{ | |
int List[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; | |
const int FIND = 7; | |
int ans = BinarySearch(List, 0, 10, FIND); | |
if (ans == -1) | |
printf("Not Found\n"); | |
else | |
printf("Found: %d\n", ans); | |
return 0; | |
} |
'개발' 카테고리의 다른 글
2의 2000승 출력하기(C/C++) (0) | 2018.05.15 |
---|---|
비선형 구조의 탐색 (0) | 2018.05.08 |
거듭제곱 빠르게 계산하기 (0) | 2018.05.07 |
삽입 정렬 - Insertion Sort (0) | 2018.05.03 |
[JAVA]JAVA 시험 정리 (0) | 2018.04.25 |
자바 default 지정자는 패키지 private이라고도 한다. (0) | 2018.04.11 |