반응형

검색 알고리즘은 컴퓨터 과학에서 필수적인 주제입니다. 데이터를 효율적으로 검색하는 방법을 이해하면 프로그램의 성능을 크게 향상시킬 수 있습니다. 이 글에서는 다양한 검색 알고리즘을 소개하고, 각각의 구현 방법과 시간 복잡도를 설명합니다.

 

목표

  • 선형 검색
  • 분류된 배열에서의 이진 검색
  • 나이브 문자열 검색 알고리즘

선형 검색 소개

선형 검색은 가장 간단한 검색 방법 중 하나입니다. 이 방법은 배열의 각 요소를 순서대로 확인하여 값이 일치하는지 확인합니다. JavaScript에서는 indexOf, includes, find, findIndex와 같은 배열 함수를 사용하여 선형 검색을 수행할 수 있습니다.

한 번에 하나씩 검색하는 이 방법을 선형 검색이라고 합니다.

 

선형 검색 연습

배열과 값을 받아들이고 그 값이 배열 안에 존재하는 경우, 그 인덱스를 반환하는 linearSearch 함수를 작성합니다. 값이 배열 안에 존재하지 않으면 -1을 반환합니다. 이 함수를 구현할 때 indexOf를 사용하지 마세요!

    function linearSearch(index){
  
    }
    
    // linearSearch([10, 15, 20, 25, 30], 15) // 1
    // linearSearch([9, 8, 7, 6, 5, 4, 3, 2, 1, 0], 4) // 5
    // linearSearch([100], 100) // 0
    // linearSearch([1,2,3,4,5], 6) // -1
    // linearSearch([9, 8, 7, 6, 5, 4, 3, 2, 1, 0], 10) // -1
    // linearSearch([100], 200) // -1

 

정답

더보기
function linearSearch(arr, val) {
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === val) {
            return i;
        }
    }
    return -1;
}

// 예시 사용법
console.log(linearSearch([10, 15, 20, 25, 30], 15)); // 1
console.log(linearSearch([9, 8, 7, 6, 5, 4, 3, 2, 1, 0], 4)); // 5
console.log(linearSearch([100], 100)); // 0
console.log(linearSearch([1, 2, 3, 4, 5], 6)); // -1
console.log(linearSearch([9, 8, 7, 6, 5, 4, 3, 2, 1, 0], 10)); // -1
console.log(linearSearch([100], 200)); // -1

 

선형 검색 빅오 (Big O)

선형 검색의 시간복잡도는 다음과 같습니다:

  • 최선의 경우: O(1) (첫 번째 요소에 있는 경우)
  • 최악의 경우: O(n) (마지막 요소에 있는 경우)

따라서 일반적인 시간복잡도는 O(n)입니다. 데이터가 분류되지 않았을 때 사용하는 좋은 방법입니다.

 

이진 검색 소개

이진 검색은 정렬된 배열에서 더 빠른 검색 방법을 제공합니다. 이진 검색은 배열을 절반으로 나누어 검색 범위를 줄여나가는 분할 정복 알고리즘입니다. 이 방법은 정렬된 배열에서만 작동합니다.

 

이진 검색 연습

정렬된 배열과 값을 받아들이고 값이 존재하는 경우 그 인덱스를 반환하는 binarySearch 함수를 작성합니다. 값이 존재하지 않으면 -1을 반환합니다.

function binarySearch(arr, value){}
binarySearch([1,2,3,4,5],2) // 1
binarySearch([1,2,3,4,5],3) // 2
binarySearch([1,2,3,4,5],5) // 4
binarySearch([1,2,3,4,5],6) // -1
binarySearch([
  5, 6, 10, 13, 14, 18, 30, 34, 35, 37, 
  40, 44, 64, 79, 84, 86, 95, 96, 98, 99
], 10) // 2
binarySearch([
  5, 6, 10, 13, 14, 18, 30, 34, 35, 37, 
  40, 44, 64, 79, 84, 86, 95, 96, 98, 99
], 95) // 16
binarySearch([
  5, 6, 10, 13, 14, 18, 30, 34, 35, 37, 
  40, 44, 64, 79, 84, 86, 95, 96, 98, 99
], 100) // -1

 

정답

더보기
function binarySearch(arr, elem) {
  let start = 0;
  let end = arr.length - 1;
  let 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;
}

이진 검색 빅오 (Big O)

이진 검색의 시간복잡도는 다음과 같습니다:

  • 최선의 경우: O(1) (첫 번째 비교에서 찾은 경우)
  • 최악의 경우: O(log N) (반복적으로 반으로 나누는 경우)

따라서 일반적인 시간복잡도는 O(log N)입니다.

 

나이브 문자열 검색

나이브 문자열 검색은 문자열 안에서 부분 문자열을 찾는 간단한 방법입니다. 긴 문자열과 짧은 문자열을 비교하여 일치하는 경우를 찾습니다.

나이브 문자열 검색 구현

function naiveSearch(long, short) {
    let count = 0;
    for(let i = 0; i < long.length; i++) {
        for(let j = 0; j < short.length; j++) {
            if(short[j] !== long[i + j]) {
                console.log("Break");
                break;
            }
            if(j === short.length - 1) {
                count++;
            }
        }
    }
    return count;
}
naiveSearch("lorie loled", "lol"); // 1

 

반응형

'Algorithm > Theory' 카테고리의 다른 글

선택 정렬 (Selection Sort)  (0) 2024.07.15
버블 정렬 (Bubble Sort) 정렬 알고리즘 소개  (0) 2024.07.14
(더 어려운) 재귀 연습 문제 1부  (0) 2024.07.10
재귀 연습 문제  (0) 2024.07.09
재귀 (Recursion)  (0) 2024.07.08
얼은펭귄