λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

CS/μ•Œκ³ λ¦¬μ¦˜

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜ (Boyer-Moore majority vote algorithm)

  • 주어진 ν›„λ³΄μž λͺ©λ‘μ—μ„œ 과반수λ₯Ό μ°¨μ§€ν•˜λŠ” 후보λ₯Ό μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.
  • λ°°μ—΄ λ‚΄ κ³Όλ°˜μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” μ›μ†Œκ°€ 항상 μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄, 결과값은 항상 과반수 μ›μ†Œκ°€ λœλ‹€.
  • 핡심 μ•„μ΄λ””μ–΄λŠ” 주어진 ν›„λ³΄μž λͺ©λ‘μ— 두 κ°€μ§€μ˜ μ„œλ‘œ λ‹€λ₯Έ 후보λ₯Ό μ§€μ •ν•˜κ³ , 이듀을 μ„œλ‘œ μƒμ‡„μ‹œμΌœκ°€λ©° μ΅œμ’… 후보λ₯Ό κ²°μ •ν•˜λŠ” 것이닀.
  • μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N), 곡간 λ³΅μž‘λ„λŠ” O(1) 이닀.

 

λ™μž‘ 방식

좜처 : https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm

 

  1. μž…λ ₯ μ‹œν€€μŠ€ μš”μ†Œ mκ³Ό μΉ΄μš΄ν„° cλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
  2. μž…λ ₯ μ‹œν€€μŠ€μ—μ„œ 각각의 μš”μ†Œ x에 λŒ€ν•΄μ„œ
    1. c == 0 이면 m = x, c = 1 λŒ€μž…ν•œλ‹€.
    2. m == x 이면 c = c + 1 λŒ€μž…ν•œλ‹€.
    3. m != x 이면 c = c -1 λŒ€μž…ν•œλ‹€.
  3. m을 λ°˜ν™˜ν•œλ‹€.

λΉ„μœ λ₯Ό ν•΄λ³΄μžλ©΄

  • ν•œ ꡐ싀에 학생듀이 λͺ¨μ—¬ μžˆλ‹€.
  • 점심 메뉴λ₯Ό 햄버거와 ν”Όμž μ€‘μ—μ„œ κ³ λ₯Ό 건데, 학생듀이 더 많이 μ„ νƒν•œ λ©”λ‰΄λ‘œ μ„ μ •ν•  것이닀.
  • 두 λͺ…μ”© 짝을 μ§“λŠ”λ‹€.
  • 두 μ‚¬λžŒμ΄ μ„ νƒν•œ 메뉴가 κ°™λ‹€λ©΄ ꡐ싀 μ•ˆμ— λ‚¨λŠ”λ‹€.
  • 두 μ‚¬λžŒμ΄ μ„ νƒν•œ 메뉴가 λ‹€λ₯΄λ‹€λ©΄ 손 작고 ꡐ싀을 λ‚˜κ°„λ‹€.
  • ꡐ싀에 λ‚¨μ•„μžˆλŠ” 학생이 κ³ λ₯Έ 메뉴λ₯Ό μ΅œμ’… μ„ νƒν•œλ‹€.

 

μ†ŒμŠ€μ½”λ“œ (JS)

const majorityElement = function (arr) {
  let candidate = 0;
  let count = 0;

  for (let i = 0; i < arr.length; i++) {
    if (count == 0) {
      candidate = arr[i];
      count = 1;
    } else if (candidate == arr[i]) {
      count++;
    } else {
      count--;
    }
  }
  return candidate;
};

 

μ°Έκ³ 

Boyer-Moore 과반수 νˆ¬ν‘œ μ•Œκ³ λ¦¬μ¦˜

Boyer–Moore majority vote algorithm

'CS > μ•Œκ³ λ¦¬μ¦˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μ•Œκ³ λ¦¬μ¦˜ λ³΅μž‘λ„  (0) 2024.08.27