우선 탐색 알고리즘은 가장 많이 쓰이는 알고리즘 중 하나이기에 알아두면 코딩테스트 혹은 추후 문제 해결 시 도움이 많이 될 것이다.
더 나아가 굳이 여기에 언급된 종류가 직접적으로 쓰이는 건 아니지만 우리가 알고있는 검색 엔진 또한 탐색 알고리즘을 기반으로 만들어졌다고 한다.
Search
라는 의미와 맞게, 탐색 알고리즘은 저장된 데이터들 중 원하는 값을 찾을 수 있게 도와주는 알고리즘이다.
어떤 것들이 있는지 간단하게 살펴보자
간단하게 예를 들자면,
const arr = [1,2,3,4,5]
for (let i = 0 ; i < arr.length ; i++) {
if (arr[i] == 4){
console.log("I found it")
}
}
이러식으로 배열의 시작점부터 5와 맞는 순간까지 돌아가면서 데이터 값을 비교하는 것이 선형 알고리즘이다.
언뜻 보면 효율성 있어 보이는 방법이지만, 단점이 명확하게 존재한다.
O(n)의 시간 복잡도
를 가진다.Up and Down
을 생각해보자간단하게 코드로 본다면 다음과 같다.
let recursiveFunction = function (arr, x, start, end) {
if (start > end) return false;
let mid=Math.floor((start + end)/2);
if (arr[mid]===x) return true;
if(arr[mid] > x)
return recursiveFunction(arr, x, start, mid-1);
else
return recursiveFunction(arr, x, mid+1, end);
}
이진 탐색 알고리즘 사용 시 중요한 점은, 데이터 값들이 내림차순 혹은 오름차순
으로 정렬이 되어 있어야 된다는 점이다.
단점이라기보단 정렬되어 있지 않은 데이터 값들의 집합인 경우, 이진 탐색보다는 선형 탐색 알고리즘이 더 적합할 수도 있다.
두 가지 탐색 알고리즘 이외에도, 해시 탐색 알고리즘 (Hash Search Algorithm)
과 이진 탐색 트리 (Binary Search Tree)
와 같은 탐색 알고리즘도 존재하나 이런 탐색 알고리즘의 경우에는 각 자료 구조 설명 시 같이 설명하는 것이 자료 구조를 이해하는 데 있어 더욱 도움이 된다.