[TIL] 211015

Lee SyongΒ·2021λ…„ 10μ›” 15일
0

TIL

λͺ©λ‘ 보기
58/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. λΉ… 였 ν‘œκΈ°λ²• / 버블 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ / 배열에 쀑볡 κ°’ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 방법 / 선택 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ / λΉ… 였의 μ—­ν•  / 같은 λΆ„λ₯˜μ— μ†ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„± 비ꡐ

  2. μ•Œκ³ λ¦¬μ¦˜ μ½”λ“œ κ΅¬ν˜„ (μžλ°”μŠ€ν¬λ¦½νŠΈ)


πŸ“– ν•™μŠ΅ 자료

  1. μ±… 'λˆ„κ΅¬λ‚˜ 자료 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜'

πŸ“š 배운 것

[TIL] 211010 μ°Έκ³ 
μƒˆλ‘­κ²Œ μ•Œκ²Œ 된 λ‚΄μš©λ“€ μœ„μ£Όλ‘œ 정리함

3μž₯. λΉ… 였 ν‘œκΈ°λ²•

πŸ“Œ 경쟁 자료 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό ν‘œν˜„ν•˜λŠ” ν˜•μ‹μ μΈ 방법

πŸ“Œ λΉ…μ˜€ ν‘œκΈ°λ²•μœΌλ‘œ μ‹€μ œ μ“°μ΄λŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λΆ„μ„ν•΄μ„œ 경쟁 자료 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜ 쀑 μ΅œμ„ μ„ κ³ λ₯Ό 수 μžˆλ‹€.

πŸ“Œ λΉ… 였 ν‘œκΈ°λ²•μ€ 일반적으둜 'μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€'λ₯Ό μ˜λ―Έν•œλ‹€.

πŸ’‘ 데이터가 μ¦κ°€ν• μˆ˜λ‘, 단계 μˆ˜λŠ” μ–΄λ–»κ²Œ λ³€ν•˜λŠ”κ°€?

1) O(1)

데이터가 증가해도 단계 μˆ˜λŠ” 항상 일정

ex. λ°°μ—΄ 읽기 / λ°°μ—΄ 맨 끝 μ‚½μž…, μ‚­μ œ

2) O(N)

데이터가 μ¦κ°€ν•œ 만큼 단계 μˆ˜κ°€ 증가

ex. 주어진 μˆ˜κ°€ μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
cf. μ†Œμˆ˜ : 1보닀 큰 μžμ—°μˆ˜ 쀑 1κ³Ό 자기 μžμ‹ λ§Œμ„ μ•½μˆ˜λ‘œ κ°€μ§€λŠ” 수

p.69
Python둜 κ΅¬ν˜„λœ μ½”λ“œ β†’ JavaScript둜 μˆ˜μ •

function isPrimeNumber (num) {
  for (let i = 2; i < num; i++) {
    if (num % i === 0) {
      return false;
    }
    return true;
  }
}

console.log(isPrimeNumber(13)); // true

항상 자기 μžμ‹ μ„, 2λΆ€ν„° μ‹œμž‘ν•΄μ„œ 자기 μžμ‹  λ°”λ‘œ 이전 μˆ˜κΉŒμ§€λ‘œ λ‚˜λˆ„λŠ” 과정을 κ±°μΉœλ‹€.
즉, ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜λŠ” μˆ«μžκ°€ μ¦κ°€ν•˜λ©΄ κ·Έ 증가뢄과 λΉ„λ‘€ν•˜μ—¬ 단계 μˆ˜λ„ μ¦κ°€ν•˜λ―€λ‘œ, μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)이닀.

3) O(log N)

데이터가 2λ°°μ”© 증가할 λ•Œλ§ˆλ‹€ 1단계 μΆ”κ°€


4μž₯. λΉ… 였둜 μ½”λ“œ 속도 올리기

πŸ“Œ λΉ… 였λ₯Ό μ‚¬μš©ν•΄ μž‘μ„±ν•œ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ ν‰κ°€ν•˜κ³ , νš¨μœ¨μ„±μ„ 높이기 μœ„ν•΄ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜μ •ν•˜κ³ μž 함

1) 버블 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

πŸ’‘ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ > λ‹¨μˆœ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ > 버블 μ •λ ¬

μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ€ λͺ¨λ‘ λ‹€μŒμ˜ 문제λ₯Ό ν•΄κ²°ν•œλ‹€.
μ •λ ¬λ˜μ§€ μ•Šμ€ 배열이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ–΄λ–»κ²Œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•  수 μžˆμ„κΉŒ?

μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ μ€‘μ—λŠ” λ‹¨μˆœ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄ μžˆλ‹€.
μ΄λŠ” μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ„œ 뢙여진 이름일 뿐, μ‹€μ œλ‘œλŠ” 이보닀 효율적인 μ•Œκ³ λ¦¬μ¦˜μ΄ μ‘΄μž¬ν•œλ‹€.

λ‹¨μˆœ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—λŠ” 버블 μ •λ ¬ / 선택 μ •λ ¬ / μ‚½μž… μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄ μžˆλ‹€.

(1) μ„€λͺ…

각 νŒ¨μŠ€μŠ€λ£¨λ§ˆλ‹€, μ •λ ¬λ˜μ§€ μ•Šμ€ κ°’ 쀑 κ°€μž₯ '큰 κ°’'인 버블이, μ˜¬λ°”λ₯Έ μœ„μΉ˜λ‘œ κ°€κ²Œ λœλ‹€.

cf. 패슀슀루(passthrough)λž€?
ν•œ 개의 데이터λ₯Ό μ œμžλ¦¬μ— μœ„μΉ˜μ‹œν‚€λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μ£Όμš” 절차

처음 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ κ΅ν™˜μ„ 적어도 ν•œ 번 μˆ˜ν–‰ν–ˆλ‹€λ©΄, λ‹€μŒ 패슀슀루λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.

(2) μ½”λ“œ κ΅¬ν˜„

p.81
Python으둜 κ΅¬ν˜„λœ μ½”λ“œ β†’ JavaScript둜 μˆ˜μ •

function bubbleSort (arr) {
  // μ–΄λ–€ μΈλ±μŠ€κΉŒμ§€ 아직 μ •λ ¬λ˜μ§€ μ•Šμ•˜λŠ”μ§€
  let unsorted_until_index = arr.length - 1;
  // λ°°μ—΄μ˜ μ •λ ¬ μ—¬λΆ€
  let sorted = false;
  let swap;

  // 패슀슀루
  while (!sorted) {
    sorted = true;
    
    // 비ꡐ & κ΅ν™˜
    for (let i = 0; i < unsorted_until_index; i++) {
      if (arr[i] > arr[i+1]) {
        swap = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = swap;
        sorted = false;
      }
    }

    unsorted_until_index = unsorted_until_index - 1;
  }

  return arr;
}


const arr1 = [4, 3, 2, 1]
console.log(bubbleSort(arr1)); // [1, 2, 3, 4]

처음 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ κ΅ν™˜μ„ 적어도 ν•œ 번 μˆ˜ν–‰ν–ˆλ‹€λ©΄(sortedκ°€ falseκ°€ 됨), λ‹€μŒ 패슀슀루λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.(sortedκ°€ falseμ΄λ―€λ‘œ)

패슀슀루λ₯Ό ν•œ 번 μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€, μ •λ ¬λ˜μ§€ μ•Šμ€ κ°’ 쀑 κ°€μž₯ 큰 값이 μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— μ •λ ¬λ˜λ―€λ‘œ, unsorted_until_index이 1μ”© κ°μ†Œν•œλ‹€.

unsorted_until_indexκ°€ 0이 되면, for ꡬ문의 쑰건식(i < unsorted_until_index)을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•΄ for ꡬ문을 μ‹€ν–‰ν•  수 μ—†μœΌλ―€λ‘œ while 문을 μ’…λ£Œν•˜κ²Œ λœλ‹€.

'μ²˜μŒλΆ€ν„° μ •λ ¬λ˜μ–΄ μžˆλŠ” λ°°μ—΄'의 경우,
unsorted_until_indexκ°€ 0이 μ•„λ‹ˆλ―€λ‘œ μ²˜μŒμ— for ꡬ문에 μ§„μž…μ€ ν•˜μ§€λ§Œ,
if ꡬ문의 쑰건식인 arr[i] > arr[i+1] 을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•΄ if ꡬ문이 μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ―€λ‘œ sorted = true인 μ±„λ‘œ while 문을 μ’…λ£Œν•˜κ²Œ λœλ‹€.

(3) λΉ… 였

버블 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—λŠ” 두 μ’…λ₯˜μ˜ 단계, 비ꡐ & κ΅ν™˜μ΄ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

  • 비ꡐ

    데이터가 N개일 λ•Œ
    첫 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-1번 비ꡐ해야 ν•˜κ³ 
    두 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-2번 비ꡐ해야 ν•˜κ³ 
    μ„Έ 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-3번 비ꡐ해야 ν•˜κ³ 
    ...
    λ§ˆμ§€λ§‰ νŒ¨μŠ€μŠ€λ£¨μ—μ„œ 1번 비ꡐ해야 ν•œλ‹€.

    μœ„ 예제의 경우, 데이터가 4κ°œμ΄λ―€λ‘œ 총 3+2+1 즉, 6번 비ꡐλ₯Ό ν•΄μ•Ό ν•œλ‹€.

  • κ΅ν™˜

    데이터가 N개일 λ•Œ
    μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€(배열이 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ μžˆλŠ” 경우)λ₯Ό κ°€μ •ν•˜λ©΄
    κ΅ν™˜μ„ 맀 λΉ„κ΅λ§ˆλ‹€ ν•΄μ•Ό ν•œλ‹€

    μœ„ 예제(μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€)의 경우, 데이터가 4κ°œμ΄λ―€λ‘œ λΉ„κ΅ν•œ 횟수만큼 6번 κ΅ν™˜μ„ ν•΄μ•Ό ν•œλ‹€.

데이터가 4개일 λ•Œ, 비ꡐ & κ΅ν™˜μ˜ μ΅œλŒ€ 단계 μˆ˜λŠ” 12κ°œκ°€ λœλ‹€.

그런데, λ°μ΄ν„°μ˜ κ°œμˆ˜κ°€ 5, 10, 15, 20개...둜 λŠ˜μ–΄λ‚˜λ©΄, μ΅œλŒ€ 단계 μˆ˜λŠ” κΈ‰κ²©νžˆ λŠ˜μ–΄λ‚œλ‹€. (데이터 개수, μ΅œλŒ€ 단계 수: 5개, 20개 / 10개, 90개 / 15개, 210개 / 20개, 380개)

μ •λ¦¬ν•˜λ©΄, λ°μ΄ν„°μ˜ κ°œμˆ˜κ°€ N개일 λ•Œ, λŒ€λž΅ N^2 단계가 κ±Έλ¦°λ‹€.
λ”°λΌμ„œ 버블 μ •λ ¬μ˜ νš¨μœ¨μ„±μ€ O(N^2)라고 ν•  수 μžˆλ‹€.
μ΄λŠ” 쒋은 μ•Œκ³ λ¦¬μ¦˜μ€ μ•„λ‹ˆλ―€λ‘œ μˆ˜μ •ν•  수 μžˆλŠ”μ§€ 고민해봐야 ν•œλ‹€.

2) 배열에 쀑볡 값이 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 방법

(1) 쀑첩 루프(for ꡬ문) ν™œμš©

  • μ½”λ“œ κ΅¬ν˜„

    p.86

function hasDuplicateValue (arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (j !== i && arr[i] === arr[j]) {
        return true;
      }
    }
  }
  return false;
}

const arr1 = [5, 1, 1, 4];
console.log(isNested(arr1)); // true
  • νš¨μœ¨μ„±(λΉ… 였)

λΉ… 였(Big-O)λŠ” λ°μ΄ν„°λŸ‰μ— λΉ„λ‘€ν•΄ μ•Œκ³ λ¦¬μ¦˜μ— μ–Όλ§ˆλ‚˜ λ§Žμ€ 단계가 ν•„μš”ν•œμ§€λ₯Ό μΈ‘μ •ν•˜λŠ” 도ꡬ이닀.
λ”°λΌμ„œ, μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ μœ„ ν•¨μˆ˜λ₯Ό λΉ… 였둜 ν‘œν˜„ν•˜λ €λ©΄ μ•„λž˜ μ§ˆλ¬Έμ— λ‹΅ν•΄μ•Ό ν•œλ‹€.

μœ„ ν•¨μˆ˜μ˜ 인자둜 데이터 N개λ₯Ό ν¬ν•¨ν•˜λŠ” 배열이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ–Όλ§ˆλ‚˜ λ§Žμ€ 단계가 κ±Έλ¦¬λŠ”κ°€?

μœ„ ν•¨μˆ˜μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ— ν¬ν•¨λœ λ‹¨κ³„μ˜ μœ ν˜•μ€ 비ꡐ이닀.

μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€λŠ”, 배열이 쀑볡 값을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ΄λ‹€.
이 경우, iλ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄ λ‚΄ μ›μ†Œλ₯Ό λͺ¨λ‘ μˆœνšŒν•  λ•Œλ§ˆλ‹€ jλ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄ λ‚΄ μ›μ†Œλ₯Ό λͺ¨λ‘ μˆœνšŒν•΄μ•Ό ν•œλ‹€.
즉, λ°°μ—΄μ˜ μ›μ†Œμ˜ κ°œμˆ˜κ°€ N개일 λ•Œ, N^2(λ°°μ—΄μ˜ μ›μ†Œμ˜ 개수 x λ°°μ—΄μ˜ μ›μ†Œμ˜ 개수) 단계가 κ±Έλ¦°λ‹€.

β†’ 쀑첩 루프 μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„± : O(N^2)

μœ„ ν•¨μˆ˜μ— 단계 수λ₯Ό κΈ°λ‘ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

function hasDuplicateValue (arr) {
  let steps = 0;
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      steps++;
      if (j !== i && arr[i] === arr[j]) {
        return true;
      }
    }
  }
  console.log(steps);
  return false;
}

const arr1 = [5, 1, 2, 4];
console.log(hasDuplicateValue(arr1)); // 16 false

(2) 쀑첩 루프 ν™œμš© x

  • μ½”λ“œ κ΅¬ν˜„

p.88

function hasDuplicateValue (arr) {
  const IndexIsNumberAlreadySeen = [];
  for (let i = 0; i < arr.length; i++) {
    if (IndexIsNumberAlreadySeen[arr[i]] === undefined) {
      IndexIsNumberAlreadySeen[arr[i]] = 1;
    } else {
      return true;
    }
  }
  return false;
}

const arr1 = [5, 9, 2, 9];
console.log(hasDuplicateValue(arr1)); // true;
  • νš¨μœ¨μ„±(λΉ… 였)

λ§ˆμ°¬κ°€μ§€λ‘œ μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ μ•Œμ•„λ³΄λ €λ©΄
μœ„ ν•¨μˆ˜λ₯Ό λΉ… 였둜 ν‘œν˜„ν•˜κΈ° μœ„ν•΄
μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€μΌ λ•Œ μ•Œκ³ λ¦¬μ¦˜μ— ν•„μš”ν•œ 단계 수λ₯Ό μ•Œμ•„λ‚΄μ•Ό ν•œλ‹€.

μœ„ ν•¨μˆ˜μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ— ν¬ν•¨λœ 단계 쀑 μ£Όμš” μœ ν˜•μ€ 비ꡐ이닀.
(μ΄λ•Œ μ‚½μž…μ€ μ€‘μš”μΉ˜ μ•Šκ²Œ λ³Έλ‹€. λ’€μ—μ„œ μ„€λͺ…ν•  것.)

μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€λŠ”, 배열이 쀑볡 값을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ΄λ‹€.
이 경우, iλ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄ λ‚΄ μ›μ†Œλ₯Ό λͺ¨λ‘ μˆœνšŒν•΄μ•Ό ν•œλ‹€.
즉, λ°°μ—΄μ˜ μ›μ†Œμ˜ κ°œμˆ˜κ°€ N개일 λ•Œ, N단계가 κ±Έλ¦°λ‹€.

β†’ μˆ˜μ •ν•œ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„± : O(N)

μœ„ ν•¨μˆ˜μ— 단계 수λ₯Ό κΈ°λ‘ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

function hasDuplicateValue (arr) {
  let steps = 0;
  const IndexIsNumberAlreadySeen = [];
  for (let i = 0; i < arr.length; i++) {
    steps++;
    if (IndexIsNumberAlreadySeen[arr[i]] === undefined) {
      IndexIsNumberAlreadySeen[arr[i]] = 1;
    } else {
      return true;
    }
  }
  console.log(steps);
  return false;
}

const arr1 = [5, 9, 2, 8];
console.log(hasDuplicateValue(arr1)); // 4 false

πŸ’‘ (1)을 (2)둜 μˆ˜μ •ν•¨μœΌλ‘œμ¨ μ½”λ“œκ°€ μ’€ 더 효율적으둜 μž‘λ™ν•˜λ„λ‘ μ΅œμ ν™”ν–ˆλ‹€. O(N^2) β†’ O(N)


5μž₯. λΉ… 였λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ μ΅œμ ν™”

πŸ“Œ λΉ… 였 ν‘œκΈ°λ²•μœΌλ‘œλŠ” 두 μ•Œκ³ λ¦¬μ¦˜μ˜ 속도가 같은데, μ‹€μ œλ‘œλŠ” μ–΄λŠ ν•œμͺ½μ΄ 더 λΉ λ₯Έ κ²½μš°κ°€ 있음

πŸ“Œ 이처럼 λΉ… 였 ν‘œκΈ°λ²•λ§ŒμœΌλ‘œ μœ μ˜λ―Έν•œ 차이λ₯Ό λ°œκ²¬ν•  수 μ—†λŠ” μ•Œκ³ λ¦¬μ¦˜λ“€μ˜ νš¨μœ¨μ„±μ„ ν‰κ°€ν•˜κ³ μž 함

1) 선택 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

πŸ’‘ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ > λ‹¨μˆœ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ > 선택 μ •λ ¬

(1) μ„€λͺ…

각 νŒ¨μŠ€μŠ€λ£¨λ§ˆλ‹€, μ •λ ¬λ˜μ§€ μ•Šμ€ κ°’ 쀑 κ°€μž₯ 'μž‘μ€ κ°’'이, μ˜¬λ°”λ₯Έ μœ„μΉ˜λ‘œ κ°€κ²Œ λœλ‹€.

(2) μ½”λ“œ κ΅¬ν˜„

p.100

  • λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ

    λ§žμ€ 쀄 μ•Œμ•˜λŠ”λ° 책을 ν™•μΈν•˜λ‹ˆ ν‹€λ¦° κ±° κ°™λ‹€.

    λ‚΄ μ½”λ“œλŠ” arr[i]κ°€ 각 패슀슀루의 μ΅œμ†Ÿκ°’μ΄λΌ for λ£¨ν”„μ˜ if ꡬ문이 μ‹€ν–‰λ˜μ§€ μ•ŠμŒμ—λ„(β†’ 비ꡐx) 쓸데없이 같은 자리(숫자)끼리의 κ΅ν™˜μ€ μΌμ–΄λ‚œλ‹€.(β†’ κ΅ν™˜o)

    즉, arr[i]κ°€ κ·Έ 자체둜 각 패슀슀루의 μ΅œμ†Ÿκ°’μΈ 경우(μ΅œμ†Ÿκ°’μ΄ 이미 μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— μžˆλŠ” 경우)λ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ•˜λ‹€.

    πŸ”₯ μΆ”κ°€!

    λ‹€λ§Œ, μ–΄μ°¨ν”Ό λΉ… μ˜€λŠ” (μƒμˆ˜ κ³ λ €x / κ°€μž₯ 높은 차수만 κ³ λ €o)μ΄λ―€λ‘œ, 선택 μ •λ ¬μ˜ 경우 μ΅œμ†Ÿκ°’μ„ κ³ λ €ν•˜λ“  μ•ˆ ν•˜λ“  λΉ… 였둜 ν‘œκΈ°λ˜λŠ” νš¨μœ¨μ„±μ—λŠ” 차이가 μ—†λ‹€.

function selectionSort (arr) {
  // 패슀슀루
  for (let i = 0; i < arr.length - 1; i++) {

    let min = arr[i];
    let minIndex = i; // 각 패슀슀루 μ΅œμ†Ÿκ°’μ˜ 인덱슀 minIndex

    // 비ꡐ
    for (let j = i + 1; j < arr.length; j++) {
      if (min > arr[j]) {
        min = arr[j];
        minIndex = j;
      }
    }

    // κ΅ν™˜
    arr[minIndex] = arr[i];
    arr[i] = min;
  }

  return arr;
}

const arr1 = [9, 2, 5, 1];
console.log(selectionSort(arr1)); // [1, 2, 5, 9]
  • 책을 μ°Έκ³ ν•΄ μˆ˜μ •

    κ΅ν™˜ 뢀뢄에 if (minIndex !== i) λ₯Ό μΆ”κ°€ν•œ ν›„ min λ³€μˆ˜ 이동

function selectionSort (arr) {
  // 패슀슀루
  for (let i = 0; i < arr.length - 1; i++) {
    let minIndex = i; // 각 패슀슀루 μ΅œμ†Ÿκ°’μ˜ 인덱슀 minIndex

    // 비ꡐ
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[minIndex] > arr[j]) {
        minIndex = j;
      }
    }

    // κ΅ν™˜
    if (minIndex !== i) {
      let min = arr[minIndex];
      arr[minIndex] = arr[i];
      arr[i] = min;
    }
  }

  return arr;
}

const arr1 = [9, 2, 5, 1];
console.log(selectionSort(arr1)); // [1, 2, 5, 9]

(3) λΉ… 였

선택 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—λŠ” 두 μ’…λ₯˜μ˜ 단계, 비ꡐ & κ΅ν™˜μ΄ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

  • 비ꡐ

    데이터가 N개일 λ•Œ
    첫 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-1번 비ꡐ해야 ν•˜κ³ 
    두 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-2번 비ꡐ해야 ν•˜κ³ 
    μ„Έ 번째 νŒ¨μŠ€μŠ€λ£¨μ—μ„œ N-3번 비ꡐ해야 ν•˜κ³ 
    ...
    λ§ˆμ§€λ§‰ νŒ¨μŠ€μŠ€λ£¨μ—μ„œ 1번 비ꡐ해야 ν•œλ‹€.

  • κ΅ν™˜

    각 νŒ¨μŠ€μŠ€λ£¨λ§ˆλ‹€ μ΅œλŒ€ 1번의 κ΅ν™˜μ΄ μΌμ–΄λ‚œλ‹€.

    μ΅œμ†Ÿκ°’μ΄ 이미 μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— μžˆλŠλƒμ— 따라 κ΅ν™˜μ„ μ•ˆ ν•˜κ±°λ‚˜ κ΅ν™˜μ„ ν•œ 번 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

    μ΅œμ•…μ˜ 경우λ₯Ό 가정해도 데이터가 N개일 λ•Œ, κ΅ν™˜μ€ N - 1λ²ˆλ°–μ— μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.


2) λΉ… 였의 μ—­ν• 

(1) λΉ…μ˜€ ν‘œκΈ°λ²•μ€ μƒμˆ˜λ₯Ό λ¬΄μ‹œν•œλ‹€

μœ„μ—μ„œ μ‚΄νŽ΄λ΄€λ“―μ΄, 선택 μ •λ ¬μ˜ 단계 μˆ˜κ°€, 버블 μ •λ ¬μ˜ 단계 μˆ˜λ³΄λ‹€ 훨씬 적닀. μžμ„Ένžˆ 따져보면, λŒ€λž΅ 2λ°° 정도 적닀. κ·ΈλŸ¬λ―€λ‘œ 선택 정렬이 버블 정렬보닀 더 νš¨κ³Όμ μž„μ„ μ•Œ 수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜, 선택 μ •λ ¬κ³Ό 버블 정렬을 λΉ… 였둜 ν‘œν˜„ν•˜λ©΄, λ‘˜ λ‹€ O(N^2)이닀.
선택 μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^2 / 2)둜 ν‘œν˜„ν•΄μ•Ό λ§žμ„ 것 κ°™μ§€λ§Œ, 그렇지 μ•Šλ‹€.
λΉ…μ˜€ ν‘œκΈ°λ²•μ€ μƒμˆ˜λ₯Ό λ¬΄μ‹œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ, μ‹€μ œλ‘œλŠ” O(N)보닀 100λ°° 느린 O(100N)이라 해도, λΉ… 였 ν‘œκΈ°λ²•μœΌλ‘œλŠ” λ˜‘κ°™μ΄ O(N)이닀.

κ·Έλ ‡λ‹€λ©΄ λΉ…μ˜€ ν‘œκΈ°λ²•μ€ 엉터리인 것인가?

(2) λΉ… 였의 μ—­ν• 

그렇지 μ•Šλ‹€.
λΉ… 였 ν‘œκΈ°λ²•μ€ 'λ‹€λ₯Έ' λΆ„λ₯˜μ— μ†ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ 비ꡐ할 λ•Œ 맀우 μœ μš©ν•˜λ‹€.

예λ₯Ό λ“€μ–΄, O(100N)κ³Ό O(N^2)을 λΉ„κ΅ν•˜λ©΄
νŠΉμ • μ‹œμ  μ΄μ „κΉŒμ§€λŠ” O(100N)이 O(N^2)보닀 λŠλ¦¬μ§€λ§Œ,
νŠΉμ • μ‹œμ  μ΄ν›„λΆ€ν„°λŠ” κ³„μ†ν•΄μ„œ O(100N)이 O(N^2)보닀 λΉ λ₯΄λ‹€.

λ”°λΌμ„œ, O(100N)이 O(N)으둜 ν‘œμ‹œλœλ‹€ ν•˜λ”λΌλ„
데이터가 λ§Žμ„ λ•Œ O(N)은 O(N^2)보닀 항상 λΉ λ₯΄λ‹€κ³  ν•  수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜, 선택 μ •λ ¬κ³Ό 버블 μ •λ ¬μ˜ 경우처럼 '같은' λΆ„λ₯˜μ— μ†ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ„μ—μ„œμ²˜λŸΌ 더 μžμ„Ένžˆ 뢄석해야 ν•œλ‹€.

πŸ’‘ '같은' λΆ„λ₯˜μ— μ†ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„± 비ꡐ

ex. 두 μ›μ†Œλ§ˆλ‹€ ν•˜λ‚˜ 걸러 ν•˜λ‚˜λ₯Ό 뽑아 μƒˆ λ°°μ—΄ 생성
ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ—λŠ” 두 μ’…λ₯˜μ˜ 단계, 룩업(lookup) & μ‚½μž…μ΄ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

p.108
Ruby둜 κ΅¬ν˜„ν•œ μ½”λ“œ β†’ JavaScript둜 μˆ˜μ •

  • 첫 번째 방법

    데이터가 N개일 λ•Œ, N번의 룩업과 N/2번의 μ‚½μž… β†’ O(1.5N)
    λΉ…μ˜€ ν‘œκΈ°λ²•μœΌλ‘œ ν‘œν˜„ν•  땐, O(N)

function makeNewArray (arr) {
  const newArray = [];
  for (let index in arr) {
    // 룩업(lookup)
    if (index % 2 === 0) {
      newArray[index/2] = arr[index]; // μ‚½μž…
    }
  }
  return newArray;
}

const arr1 = [5, 3, 7, 4, 6];
console.log(makeNewArray(arr1)); // [5, 7, 6]
  • 두 번째 방법

    데이터가 N개일 λ•Œ, N/2번의 룩업과 N/2번의 μ‚½μž… β†’ O(N)
    첫 번째 방법보닀 λΉ λ₯΄λ‹€

function makeNewArray (arr) {
  const newArray = [];
  let index = 0;

  for (let i = 0; i < arr.length / 2; i++) {
    newArray[i] = arr[index]; // 룩업 & μ‚½μž…
    index += 2;
  }

  return newArray;
}

const arr1 = [5, 3, 7, 4, 6];
console.log(makeNewArray(arr1)); // [5, 7, 6]

✨ 내일 ν•  것

  1. μ±… 계속 읽기
profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€