HJW's IT Blog

Algorithm: 과반수 찾기 본문

알고리즘

Algorithm: 과반수 찾기

kiki1875 2023. 4. 14. 14:42

Brute Force Method

  • 자신보다 뒤에 나오는 수 가 자신과 같다면 카운팅 해가며 찾는방법
  • O(n^2)

O(n log n) 방법

  • 원소들을 정렬한다 (O(n log n) 의 시간)
    • 정렬전: 3 1 2 2 1 1 1 1 2 1 3 2 1 1 1 2
    • 정렬후: 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3
  • 등장 횟수를 검사하는데에 O(n)의 시간
  • 전체 시간: O(n log n)

O(n) 방법: Boyer-Moore

다음과 같이 작동한다: 같은 수라면 skip, 다른 수라면 상쇄

  • 다음 숫자열에 대해 작동 과정을 살펴보자
  • 3 1 2 2 1 1 1 1 2 1 3 2 1 1 1 2
    • 3 1 2 2 1 1 1 1 2 1 3 2 1 1 1 2 (상쇄)
    • 2 2 1 1 1 1 2 1 3 2 1 1 1 2 (skip)
    • 2 2 1 1 1 1 2 1 3 2 1 1 1 2 (상쇄)
    • 2 1 1 1 2 1 3 2 1 1 1 2
    • 1 1 2 1 3 2 1 1 1 2
    • 1 1 2 1 3 2 1 1 1 2
    • 1 1 3 2 1 1 1 2
    • 1 1 3 2 1 1 1 2
    • 1 2 1 1 1 2
    • 1 1 1 2
    • 1 1 1 2
    • 1 1 1 2
    • 1 1
    • 1 1 1 9 9 9 2 1 2 1 1
  • 증명
    • 과반수인 원소가 x 라고 하자. 위 방법을 사용해 왼쪽 한 그룹을 제거하더라도 남은 원소 중 과반수인 원소는 x
    • 첫 원소는 둘중 하나: x 이거나 x가 아니거나.
      • x 라면 x 가 나온 횟수만큼 다른 원소들이 맨 왼쪽 한 그룹에 포함
      • 같은 횟수만큼 x와 다른 원소가 제거되므로 남은 원소 중 과반수 이상이 x
      • 만약 x 가 첫 원소가 아니더라도 여전히 남은 원소 중 과반수 이상이 x
    • 만약 절반 이상으로 나오는 값이 있다면 가장 오른쪽 그룹의 맨 앞의 값이다.
      • 과반수 원소가 m 이라고 하고 각 원소마다 자신이 m 이면 카운터를 +1 아니면 -1 
      • 과반수가 있다면 카운터 값은 1 이상

'알고리즘' 카테고리의 다른 글

Algorithm: Segment Tree  (0) 2023.04.14
Algorithm: 욕심쟁이 기법  (0) 2023.04.14
Algorithm: 트리 지름  (0) 2023.04.14
Algorithm: 부분합(Prefix Sum)  (1) 2023.04.13
Algorithm: RMQ(Range Minimum Query)  (0) 2023.04.12