Algorithm basic 2

2020-05-13
computer-science

칸아카데미의 알고리즘 코스를 들으며 정리해본 알고리즘 기초.
https://ko.khanacademy.org/computing/computer-science/algorithms


좀더 빠른 정렬? feat. 재귀적 알고리즘 설계

선택정렬과 삽입정렬의 최대 실행시간은 O(n^2)이다. 따라서 입력하는 배열의 크기가 크다면 매우 오랜 시간이 걸린다. 하지만 재귀를 활용하면 더 빠르게 정렬할 수 있다. 각 정렬의 실행시간은 다음과 같다.

sort


[병합정렬 (merge sort)]

merge-sort

분할 정복 (divide and conquer)식 알고리즘 ?


예시: javascript

const merge = function (array, p, q, r) {
  let leftHalf = [];
  let rightHalf = [];
  let k = p;
  let i = 0;
  let j = 0;

  for (i; k <= q; i++, k++) leftHalf[i] = array[k];
  for (j; k <= r; j++, k++) rightHalf[j] = array[k];

  k = p;
  i = 0;
  j = 0;

  while (i < leftHalf.length && j < rightHalf.length) {
    if (leftHalf[i] < rightHalf[j]) {
      array[k] = leftHalf[i];
      i++;
    } else {
      array[k] = rightHalf[j];
      j++;
    }

    k++;
  }

  while (i < leftHalf.length) {
    array[k] = leftHalf[i];
    k++;
    i++;
  }

  while (j < rightHalf.length) {
    array[k] = rightHalf[j];
    k++;
    j++;
  }
};

function mergeSort(array, p, r) {
  if (p < r) {
    const q = Math.floor((p + r) / 2);

    mergeSort(array, p, q);
    mergeSort(array, q + 1, r);
    merge(array, p, q, r);

    return array;
  }
}

—> 병합과정에서 두 요소만을 비교하고 각 요소는 최대 한 번의 비교로 array로 다시 복사된다. 따라서 병합하는 과정은 입력값 n만큼의 복잡도를 지닌다. 그리고 분할-정복을 재귀적으로 반복할 때에는 처리할 입력값 n이 n/2, n/4, n/8... 의 형태로 줄어든다. 따라서 병합정렬의 실행시간은 O(n logn)이다.

—> 병합정렬은 계속 왼쪽과 오른쪽의 하위배열 복사본을 만들어야 하여 저장공간이 필요하다. 즉, 이 정렬은 정렬할 배열이 저장된 그 자리에서 작동하지 않는다.



[퀵정렬 (quick sort)]

quick-sort


예시: javascript

const swap = function (array, firstIndex, secondIndex) {
  const temp = array[firstIndex];

  array[firstIndex] = array[secondIndex];
  array[secondIndex] = temp;
};

const partition = function (array, p, r) {
  let q = p;

  for (let i = p; i < r; i++) {
    if (array[i] <= array[r]) {
      swap(array, i, q);
      q++;
    }
  }

  swap(array, r, q);

  return q;
};

const quickSort = function (array, p, r) {
  if (p < r) {
    const q = partition(array, p, r);

    quickSort(array, p, q - 1);
    quickSort(array, q + 1, r);
  }
};

—> 하위 배열의 파티션을 나누는 데는 n만큼의 시간이 걸린다.


파티션하는 과정 ?

partition

백준 알고리즘을, 특히 파이썬으로 풀면서 참고할 것들 정리

2024-01-20
computer-science

After reading <code>

2020-11-18
review computer-science

After reading <concepts of programming languages>

2020-06-28
review computer-science
comments powered by Disqus