Поиск k-ой порядковой статистики за линейное время — различия между версиями
м (→Идея алгоритма) |
м (→Описание алгоритма) |
||
Строка 11: | Строка 11: | ||
== Описание алгоритма == | == Описание алгоритма == | ||
#Все <tex>n</tex> элементов входного массива разбиваются на группы по пять элементов, в последней группе будет <tex>n</tex> <tex>\bmod</tex> <tex> 5</tex> элементов. Эта группа может оказаться пустой при <tex>n</tex> кратных <tex>5</tex>. | #Все <tex>n</tex> элементов входного массива разбиваются на группы по пять элементов, в последней группе будет <tex>n</tex> <tex>\bmod</tex> <tex> 5</tex> элементов. Эта группа может оказаться пустой при <tex>n</tex> кратных <tex>5</tex>. | ||
− | #Сначала сортируется каждая группа, затем | + | #Сначала сортируется каждая группа, затем из каждой группы выбирается медиана. |
− | #Путем рекурсивного вызова шага | + | #Путем рекурсивного вызова шага определяется медиана <tex>x</tex> из множества медиан (верхняя медиана в случае чётного количества), найденных на втором шаге. Найденный элемент массива <tex>x</tex> используется как рассекающий (за <tex>i</tex> обозначим его индекс). |
− | # | + | #Массив делится относительно рассекающего элемента <tex>x</tex>. |
− | #Если <tex>i | + | #Если <tex>i = k</tex>, то возвращается значение <tex>x</tex>. Иначе запускается рекурсивно поиск элемента в одной из частей массива: <tex>k</tex>-ой статистики в левой части при <tex>i > k</tex> или <tex>(k - i - 1)</tex>-ой статистики в правой части при <tex>i < k</tex> |
=== Пример работы алгоритма === | === Пример работы алгоритма === | ||
− | |||
Рассмотрим работу алгоритма на массиве из <tex> 25 </tex> элементов, обозначенных кружками. | Рассмотрим работу алгоритма на массиве из <tex> 25 </tex> элементов, обозначенных кружками. | ||
Строка 31: | Строка 30: | ||
[[Файл:поиск2.png| 300px]] | [[Файл:поиск2.png| 300px]] | ||
− | + | На рисунке обозначены закрашенные области, в левом верхнем и в правом нижнем углах. В эти области попали все элементы, которые точно меньше или больше рассекающего элемента, соответственно. В каждой области по <tex> 8 </tex> элементов, всего же в массиве <tex> 25 </tex>, то есть мы получили хорошее (то есть соответствующее нашему утверждению) разбиение массива относительно опорного элемента, так как <tex> 8 > \frac{3 \cdot 25}{10}</tex>. Теперь докажем, что алгоритм также хорошо выбирает опорный элемент и в общем случае. | |
Cначала определим нижнюю границу для количества элементов, превышающих по величине рассекающий элемент <tex>x</tex>. В общем случае как минимум половина медиан, найденных на втором шаге, больше или равны медианы медиан <tex>x</tex>. Таким образом, как минимум <tex>n</tex> <tex>/</tex> <tex>10</tex> групп содержат по <tex>3</tex> превышающих величину <tex>x</tex>, за исключение группы, в которой меньше <tex>5</tex> элементов и ещё одной группы, содержащей сам элемент <tex>x</tex>. Таким образом получаем, что количество элементов больших <tex>x</tex>, не менее <tex>\frac{3n}{10}</tex>. | Cначала определим нижнюю границу для количества элементов, превышающих по величине рассекающий элемент <tex>x</tex>. В общем случае как минимум половина медиан, найденных на втором шаге, больше или равны медианы медиан <tex>x</tex>. Таким образом, как минимум <tex>n</tex> <tex>/</tex> <tex>10</tex> групп содержат по <tex>3</tex> превышающих величину <tex>x</tex>, за исключение группы, в которой меньше <tex>5</tex> элементов и ещё одной группы, содержащей сам элемент <tex>x</tex>. Таким образом получаем, что количество элементов больших <tex>x</tex>, не менее <tex>\frac{3n}{10}</tex>. |
Версия 12:44, 12 июня 2012
Определение: |
-ой порядковой статистикой набора элементов линейно упорядоченного множества называется такой его элемент, который является -ым элементом набора в порядке сортировки |
Содержание
Историческая справка
Алгоритм Блюма-Флойда-Пратта-Ривеста-Тарьяна (BFPRT-алгоритм) создан Мануэлем Блюмом (Manuel Blum), Робертом Флойдом (Robert Floyd), Воганом Рональдом Праттом (Vaughan Ronald Pratt), Роном Ривестом (Ron Rivest) и Робертом Тарьяном (Robert Tarjan) в 1973 году.
Идея алгоритма
Этот алгоритм является модификацией алгоритма поиска k-ой порядковой статистики. Важное отличие заключается в том, что время работы алгоритма в наихудшем случае — , где — количество элементов в множестве. Главная идея алгоритма заключается в том, чтобы гарантировать хорошее разбиение массива. Алгоритм выбирает такой рассекающий элемент, что количество чисел, которые меньше рассекающего элемента, не менее . Элементов же больших опорного элемента, также не менее . Благодаря этому алгоритм работает за линейное время в любом случае.
Описание алгоритма
- Все элементов входного массива разбиваются на группы по пять элементов, в последней группе будет элементов. Эта группа может оказаться пустой при кратных .
- Сначала сортируется каждая группа, затем из каждой группы выбирается медиана.
- Путем рекурсивного вызова шага определяется медиана из множества медиан (верхняя медиана в случае чётного количества), найденных на втором шаге. Найденный элемент массива используется как рассекающий (за обозначим его индекс).
- Массив делится относительно рассекающего элемента .
- Если , то возвращается значение . Иначе запускается рекурсивно поиск элемента в одной из частей массива: -ой статистики в левой части при или -ой статистики в правой части при
Пример работы алгоритма
Рассмотрим работу алгоритма на массиве из
элементов, обозначенных кружками.На вход подается массив, разобьем элементы на группы по 5 элементов. Отсортируем элементы каждой группы и выберем медианы. Полученные медианы групп отмечены белыми кружками.
Рекурсивно вызовемся от медиан групп и получим рассекающий элемент. На рисунке он обозначен белым кружком, внутри которого изображен символ .
На рисунке обозначены закрашенные области, в левом верхнем и в правом нижнем углах. В эти области попали все элементы, которые точно меньше или больше рассекающего элемента, соответственно. В каждой области по
элементов, всего же в массиве , то есть мы получили хорошее (то есть соответствующее нашему утверждению) разбиение массива относительно опорного элемента, так как . Теперь докажем, что алгоритм также хорошо выбирает опорный элемент и в общем случае.Cначала определим нижнюю границу для количества элементов, превышающих по величине рассекающий элемент
. В общем случае как минимум половина медиан, найденных на втором шаге, больше или равны медианы медиан . Таким образом, как минимум групп содержат по превышающих величину , за исключение группы, в которой меньше элементов и ещё одной группы, содержащей сам элемент . Таким образом получаем, что количество элементов больших , не менее .Проведя аналогичные рассуждения для элементов, которые меньше по величине, чем рассекающий элемент
, мы получим, что как минимум меньше, чем элемент . Теперь проведем анализ времени работы алгоритма.Анализ времени работы алгоритма
Пусть
— время работы алгоритма для элементов, тогда оно не больше, чем сумма:- времени работы на сортировку групп и разбиение по рассекающему элементу, то есть ;
- времени работы для поиска медианы медиан, то есть ;
- времени работы для поиска -го элемента в одной из двух частей массива, то есть , где — количество элементов в этой части. Но не превосходит , так как чисел, меньших рассекающего элемента, не менее — это медиан, меньших медианы медиан, плюс не менее элементов, меньших этих медиан. С другой стороны, чисел, больших рассекающего элемента, так же не менее , следовательно , то есть в худшем случае .
Тогда получаем, что
Покажем, что для всех
выполняется неравенство .Докажем по индукции:
- Предположим, что наше неравенство выполняется при малых , для некоторой достаточно большой константы .
- Тогда, по предположению индукции, и , тогда
Так как
, то время работы алгоритмаЛитература
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ