Мажорирующий элемент — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
(Доказательство)
Строка 25: Строка 25:
  
 
=== Доказательство ===
 
=== Доказательство ===
 +
 +
На каждом шаге мы берем случайный элемент. Проверка на мажорируемость выполняется за <tex>O(N)</tex>. Вероятность, что мы выбрали элемент "удачно" составляет <tex>1 / K</tex>. Тогда, в среднем, мы будем делать <tex>K</tex> шагов. Итоговая сложность <tex>O(N \cdot K)</tex>.
  
 
== Источники ==
 
== Источники ==

Версия 13:15, 24 мая 2013

Формулировка задачи

Требуется в массиве длиной N найти элемент, встречающийся более N/2 раз.

Решение за O(n)

Обобщение на случай поиска элемента, встречающегося N/K раз

"Хитрое" решение

Выберем случайный элемент в массиве и проверим, встречается ли он больше, чем [math]N / K[/math] раз. Будем делать так, пока не найдем нужный элемент. Утверждается, что данный алгоритм в среднем работает за [math]O(N \cdot K)[/math]

Псевдокод

findMajorityElement(a, N, K)
  while true
    candidate = a[random(N)]
    count = 0
    for i = 0 to N - 1
      if a[i] == candidate
        count++
    if count > N / K
      return candidate

Доказательство

На каждом шаге мы берем случайный элемент. Проверка на мажорируемость выполняется за [math]O(N)[/math]. Вероятность, что мы выбрали элемент "удачно" составляет [math]1 / K[/math]. Тогда, в среднем, мы будем делать [math]K[/math] шагов. Итоговая сложность [math]O(N \cdot K)[/math].

Источники