배열이나 문자열이 주어질 때, 특정 값이 있는지 확인하는 방법.
크게 선형 검색
과 이진 검색
이 있다.
모든 개별 항목을 순서대로 살펴보는 방법
시간 복잡도 : O(1) 혹은 O(n)
메서드 : indexOf, includes, find, findIndex
indexOf는 특정 값의 index를 return 한다. (없으면 -1을 return)
includes는 특정 값의 유무(T/F)를 retun 한다.
Write a function called linearSearch which accepts an array and a value, and returns the index at which the value exists. If the value does not exist in the array, return -1.
Don't use indexOf to implement this function!
반복문을 통해 배열에 있는 요소를 n과 하나씩 비교한다.
(indexOf, includes 같은 메서드들의 알고리즘도 이와 같다.)
function linearSearch(arr, n){
for(let i=0;i<arr.length;i++){
if(arr[i] === n) return i;
}
return -1;
}
정렬된 배열의 중간 지점부터 왼쪽이나 오른쪽으로 검색하는 방법
⚠️ 주의 사항
: 이진 검색은
정렬된
배열에서만 작동하므로 데이터가 반드시 정렬되어 있어야 한다.
(정렬되지 않았을 때는 쓸모가 없기 때문에 선형 검색을 활용한다.)
ex) [1,3,8,13,18,21,25,27,30,32] 에서 25의 위치 찾기
18
18
< 25
이므로 18
의 오른쪽에 있는 값 [21,25,27,30,32] 에서 다시 중간 지점을 찾는다. -> 27
25
< 27
이므로 27의 왼쪽인 [21,25] 에서 검색하면 25를 찾을 수 있다.왼쪽 포인터
, 배열의 마지막 지점에 오른쪽 포인터
를 하나 만들어준다.function binarySearch(arr, elem) {
var start = 0;
var end = arr.length - 1;
var middle = Math.floor((start + end) / 2);
while(arr[middle] !== elem && start <= end) {
if(elem < arr[middle]) end = middle - 1;
else start = middle + 1;
middle = Math.floor((start + end) / 2);
}
return arr[middle] === elem ? middle : -1;
}
binarySearch([2,5,6,9,13,15,28,30], 103)
// binarySearch([1,2,3,4,5],2) // 1
// binarySearch([1,2,3,4,5],3) // 2
긴 문자열에서 부분 문자열을 검색하는 것과 관련됨.
긴 문자열에서 짧은 문자열의 갯수 찾기
function naiveSearch(long, short){
var count = 0;
for(var i = 0; i < long.length; i++){
for(var j = 0; j < short.length; j++){
if(short[j] !== long[i+j]) break;
if(j === short.length - 1) count++;
}
}
return count;
}
naiveSearch("lorie loled", "lol") // 1
ex) naiveSearch("lorie loled", "lol")
i j
l l
o o
l r break
o l break
r l break
i l break
e l break
l l
o o
l l count++
o l break
l l
e o break
d l break