thisyujeong.dev

분할과 정복 패턴
August 10, 2022

JavaScript 알고리즘 & 자료구조 마스터 클래스 강의를 듣고 작성하는 강의노트

분할과 정복 패턴의 개념

Divide and Conquer

한 문제를 둘 이상의 부분으로 분할하여 해결하고 이를 합쳐 원래의 문제를 해결하는 기법으로 주로 배열이나 문자열 같은 큰 규모의 데이터세트를 처리한다.

Example

search 함수는 정렬된 배열과 배열의 인덱스를 가리키는 수를 인자로 받는다. 반드시 '정렬된' 배열이어야 한다.

이러한 구조를 '선형 탐색' 이라고 한다.
시간 복잡도: O(N)

function search(arr, val) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === val) {
      return i;
    }
  }
  return -1;
}
 
search([1, 2, 3, 4, 5, 6], 4); // 3
search([1, 2, 3, 4, 5, 6], 6); // 5
search([1, 2, 3, 4, 5, 6], 11); // -1

Refactor

시간 복잡도: Log(N) - 이진 탐색

function search(array, val) {
  let min = 0;
  let max = array.length - 1;
 
  while (min <= max) {
    let middle = Math.floor((min + max) / 2); // 1
    let currentElement = array[middle];
 
    if (array[middle] < val) {
      min = middle + 1;
    } else if (array[middle] > val) {
      max = middle - 1;
    } else {
      return middle;
    }
  }
  return -1;
}
 
search([1, 2, 3, 4, 5, 6], 4); // 3
search([1, 2, 3, 4, 5, 6], 6); // 5
search([1, 2, 3, 4, 5, 6], 11); // -1
  1. 중간 지점(middle)을 찾아 찾고자 하는 수(val)에 대해 크고 작음을 비교한다.
  2. 찾고자하는 수보다 작다면 중간지점으로부터 이전의 수는 탐색하지 않는다.
  3. 중간지점으로부터 이후의 배열요소에 대하여 1~2번 절차를 반복한다.

위의 절차와 같이 분할 정복 패턴은 시간을 크게 단축시킬 수 있다.