Россия, Пошатово |
Рекурсия
7.4.8. (Для знакомых с основами теории вероятностей). Доказать, что математическое ожидание числа операций при работе этого алгоритма не превосходит , причем константа не зависит от сортируемого массива.
Указание. Пусть - максимум математического ожидания числа операций для всех входов длины . Из текста процедуры вытекает такое неравенство:
Первый член соответствует распределению элементов на меньшие, равные и большие. Второй член - это среднее математическое ожидание для всех вариантов случайного выбора. (Строго говоря, поскольку среди элементов могут быть равные, в правой части вместо и должны стоять максимумы по всем , не превосходящим или , но это не мешает дальнейшим рассуждениям.) Далее индукцией по нужно доказывать оценку . При этом для вычисления среднего значения по всем нужно вычислять по частям как . При достаточно большом член в правой части перевешивается за счет интеграла , и индуктивный шаг проходит.7.4.9. Имеется массив из различных целых чисел и число . Требуется найти -ое по величине число в этом массиве, сделав не более действий, где - некоторая константа, не зависящая от и .
Замечание. Сортировка позволяет очевидным образом сделать это за действий. Очевидный способ: найти наименьший элемент, затем найти второй, затем третий, -ый требует порядка действий, то есть не годится (константа при зависит от ).
Указание. Изящный (хотя практически и бесполезный - константы слишком велики) способ сделать это таков:
А. Разобьем наш массив на групп, в каждой из которых по элементов. Каждую группу упорядочим.
Б. Рассмотрим средние элементы всех групп и перепишем их в массив из элементов. С помощью рекурсивного вызова найдем средний по величине элемент этого массива.
В. Сравним этот элемент со всеми элементами исходного массива: они разделятся на большие его и меньшие его (и один равный ему). Подсчитав количество тех и других, мы узнаем, в какой из этих частей должен находится искомый ( -ый) элемент и каков он там по порядку.
Г. Применим рекурсивно наш алгоритм к выбранной части.
Пусть - максимально возможное число действий, если этот способ применять к массивам из не более чем элементов ( может быть каким угодно). Имеем оценку:
Последнее слагаемое объясняется так: при разбиении на части каждая часть содержит не менее элементов. В самом деле, если - средний из средних, то примерно половина всех средних меньше . А если в пятерке средний элемент меньше , то еще два заведомо меньше . Тем самым по крайней мере от половины элементов меньше .Теперь по индукции можно доказать оценку (решающую роль при этом играет то обстоятельство, что ).