Рекурсия
7.4.8.
(Для знакомых с основами теории вероятностей). Доказать,
что математическое ожидание числа операций при работе этого
алгоритма не превосходит , причем константа
не зависит от сортируемого массива.
Указание.
Пусть - максимум математического ожидания числа
операций для всех входов длины
. Из текста процедуры
вытекает такое неравенство:
![T(n) \le Cn + \frac{1}{n}\sum_{k+l=n-1} \bigl( T(k)+T(l) \bigr)](/sites/default/files/tex_cache/07b1974f3ab0ff083d9f4ffdf1f2d399.png)
![T(k)](/sites/default/files/tex_cache/65ef40d2f412def7ed2b9daad4e01875.png)
![T(l)](/sites/default/files/tex_cache/1b3f8e2e0133c8a96397e1c899b5acdb.png)
![T(x)](/sites/default/files/tex_cache/aef077a1c7b98f6091af987a5eb78742.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
![k](/sites/default/files/tex_cache/8ce4b16b22b58894aa86c421e8759df3.png)
![l](/sites/default/files/tex_cache/2db95e8e1a9267b7a1188556b2013b33.png)
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
![T(n) \le C'n\ln
n](/sites/default/files/tex_cache/374b70a47b4284af5352f56f8c8ead16.png)
![x ln x](/sites/default/files/tex_cache/b2f843492a8d6b9efa2856007f7e7701.png)
![x=1,\ldots,n-1](/sites/default/files/tex_cache/9a4e082c6572348ce361fbbf1b5898dd.png)
![\int_1^n x ln x\,dx](/sites/default/files/tex_cache/e2ee3c064c76c600098224618616356f.png)
![\int ln x \, d(x^2)](/sites/default/files/tex_cache/fb504572b8ef43ab64da5ced797574f4.png)
![C'](/sites/default/files/tex_cache/54c3feec630d4b02ddafdcf92587560e.png)
![Cn](/sites/default/files/tex_cache/7405ceb2813b0f90ace74494d21ef4b8.png)
![\int x^2\, d ln x](/sites/default/files/tex_cache/8a7b50f72a42c9d5421a220d0b2d7c99.png)
7.4.9.
Имеется массив из различных целых чисел
и число
. Требуется найти
-ое по величине число
в этом массиве, сделав не более
действий, где
-
некоторая константа, не зависящая от
и
.
Замечание. Сортировка позволяет очевидным образом сделать
это за действий. Очевидный способ: найти
наименьший элемент, затем найти второй, затем
третий,
-ый требует порядка
действий,
то есть не годится (константа при
зависит от
).
Указание. Изящный (хотя практически и бесполезный - константы слишком велики) способ сделать это таков:
А. Разобьем наш массив на групп, в каждой из
которых по
элементов. Каждую группу упорядочим.
Б. Рассмотрим средние элементы всех групп и перепишем
их в массив из элементов. С помощью рекурсивного
вызова найдем средний по величине элемент этого массива.
В. Сравним этот элемент со всеми элементами исходного
массива: они разделятся на большие его и меньшие его
(и один равный ему). Подсчитав количество тех и других, мы
узнаем, в какой из этих частей должен находится искомый
( -ый) элемент и каков он там по порядку.
Г. Применим рекурсивно наш алгоритм к выбранной части.
Пусть - максимально возможное число действий, если
этот способ применять к массивам из не более
чем
элементов (
может быть каким угодно). Имеем
оценку:
![T(n) \le
Cn + T(n/5) + T (\text{примерно 0{,}7n}).](/sites/default/files/tex_cache/f234a16afd9661e164f06c1aa6072ff0.png)
![0{,}3n](/sites/default/files/tex_cache/b4ebb3a7558b6e79fa24bf563d254217.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
![3/5](/sites/default/files/tex_cache/e76a81a7ce35efbc634bb0add7223aa4.png)
![x](/sites/default/files/tex_cache/9dd4e461268c8034f5c8564e155c67a6.png)
Теперь по индукции можно доказать оценку
(решающую роль при этом играет то обстоятельство, что
).