Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

11.5. Выбор 543

11.5.2 Рандомизированный быстро-избранный

В применении образца сливы-и-поиска к проблеме выбора мы можем проектировать простой и практический метод, названный рандомизировал быстро-избранный, для нахождения kth самого маленького элемента в незаказанной последовательности n элементов, на которых определено полное отношение заказа. Рандомизированные быстро-избранные пробеги в O (n) ожидали время, принятое весь возможный случайный выбор, сделанный алгоритмом. Это ожидание не зависит что от любых предположений хаотичности о входном распределении. Мы отмечаем, хотя это рандомизировало быстро-избранные пробеги в O (n2) время в худшем случае. Оправдание этого оставляют как осуществление (Упражнение R-11.26). Мы также обеспечиваем осуществление (Упражнение C-11.32) для изменения рандомизированного быстро-избранный, чтобы получить de - terministic алгоритм выбора, который управляет в O (n) временем худшего случая. Существование этого детерминированного алгоритма имеет главным образом теоретический интерес, однако, так как постоянный множитель, скрытый большим о примечанием, относительно большой в этом случае.

Предположим, что нам дают несортированную последовательность S n сопоставимых элементов к -

gether с целым числом kÎ [1, n]. В высоком уровне, быстро-избранном алгоритме для

нахождение kth самого маленького элемента в S подобно в структуре рандомизированному быстрому -

алгоритм вида описан в Разделе 11.2.1. Мы выбираем элемент x от S наугад и используем это в качестве «центра», чтобы подразделить S на три подпоследовательности L, E, и G, храня элементы S меньше, чем x, равный x и больше, чем x, соответственно. Это - шаг сливы. Затем основанный на ценности k, мы определяем который из этих наборов, чтобы повториться на. Рандомизированный быстро-избранный описан в Кодовом Фрагменте 11.12.

Алгоритм quickSelect (S, k):

Вход: Последовательность S n сопоставимых элементов и целого числа kÎ [1, n]

Продукция: kth самый маленький элемент S

если n = 1 тогда

возвратите (первый) элемент S.

выберите случайное (центр) элемент x S и разделите S на три последовательности:

L, храня элементы в S меньше, чем x E, храня элементы в S равняются x G, храня элементы в S, больше, чем x.

если k£|L тогда

quickSelect (L, k)

еще, если k£|L  +|E тогда

возвратите x Каждый элемент в E равен x

еще

quickSelect (G, k-|L -|E ) Отмечают новый параметр выбора

Кодовый Фрагмент 11.12: Рандомизированный быстро-избранный алгоритм.

544 Глава 11. Сортировка, наборы и выбор

11.5.3 Анализ, рандомизированный быстро-избранный

Показ, что рандомизированные быстро-избранные пробеги в O (n) время требуют простого prob-

аргумент abilistic. Аргумент основан на линейности ожидания, которое заявляет, что, если X и Y случайные переменные и c, число, то

E (X +Y) = E (X) + E (Y) и E (cX) = cE (X),

где мы используем E (Ζ), чтобы обозначить математическое ожидание выражения.

Позвольте t (n) быть продолжительностью рандомизированных, быстро-избранных на последовательности размера n.

Так как этот алгоритм зависит от случайных событий, его продолжительность, t (n), является случайной переменной. Мы хотим к связанному E (t (n)), математическое ожидание t (n). Скажите, что рекурсивная просьба нашего алгоритма «хороша», если это делит S так, чтобы размер L и G был в большей части 3n/4. Ясно, рекурсивный вызов хорош с вероятностью 1/2. Позвольте g (n), обозначают число последовательных рекурсивных звонков, которые мы сделали, включая существующий, прежде чем мы получим хороший. Тогда мы можем характеризовать t (n) использование следующего уравнения повторения

t (n)миллиард £ g (n) + t (3n/4),

где b³ 1 является константой. Применяя линейность ожидания n> 1, мы добираемся

E (t (n))£ E (миллиард g (n) + t (3n/4)) = миллиард E (g (n)) + E (t (3n/4)).

Так как рекурсивный вызов хорош с вероятностью 1/2, и хорош ли рекурсивный вызов или не независим на его родительском требовании, являющемся хорошим, математическое ожидание g (n) совпадает с ожидаемым количеством раз, мы должны flip справедливая монета, прежде чем это подойдет «головы». Таким образом, E (g (n)) = 2. Таким образом, если мы позволяем T (n) быть стенографией для E (t (n)), тогда мы можем написать случай для n> 1 как

T (n)£ T (3n/4) + 2 миллиарда.

Чтобы преобразовать это отношение в закрытую форму, давайте многократно обратимся, это неравенство, принимающее n, большое. Так, например, после двух заявлений,

T (n)£ T ((3/4) 2n) + 2b (3/4) n + 2 миллиарда.

В этом пункте мы должны видеть, что общий случай

log4/3 n 

T (n)£2 миллиарда å0 (3/4) я. я =

Другими словами, ожидаемая продолжительность - самое большее 2 миллиарда раз геометрическая сумма

чья основа - положительное число меньше чем 1. Таким образом, Суждением 4.5, T (n) - O (n). Суждение 11.11: ожидаемая продолжительность рандомизированных, быстро-избранных на последовательности S размера n, является O (n), предполагая, что два элемента S могут быть сравнены в O (1) время.