Wikipedia lists the median-of-medians algorithm as requiring O(1)
auxiliary space.Почему алгоритм медианы медианов описывается как использование вспомогательного пространства O (1)?
Однако в середине алгоритма, мы делаем рекурсивный вызов подмассива размера n/5
найти медиану медианы. Когда этот рекурсивный вызов возвращается, мы используем возвращаемый медиан медианов в качестве поворота для разбиения массива.
Этот алгоритм не нажимает O(lg n)
записи активации в стек времени выполнения как часть рекурсии? Из того, что я вижу, эти рекурсивные вызовы для поиска последовательных медианов медианов не могут быть оптимизированы с помощью хвоста, потому что мы делаем дополнительную работу после возвращения рекурсивных вызовов. Поэтому, похоже, этот алгоритм требует O(lg n)
вспомогательного пространства (как и Quicksort, список Википедии которого требует O(lg n)
вспомогательного пространства из-за пространства, используемого стеком времени выполнения).
Я что-то упустил, или статья Википедии не так?
(Примечание. Рекурсивный вызов я имею в виду это return select(list, left, left + ceil((right - left)/5) - 1, left + (right - left)/10)
на странице Википедии)
Это просто пример того, как он используется в quickselect. Если вы внимательно прочитаете статью, вы обнаружите, что * только * сводная функция содержит фактический алгоритм медианных медианов. – Nuclearman
@Nuclearman Это справедливая точка, но функция 'pivot' делает вызов' select ', поэтому мы не можем сэкономить место, необходимое для 'select'.Статья в Википедии описывает две функции как * взаимно рекурсивные *. Если мы проигнорируем вызов 'select', мы не получим медиану медианов. Вместо этого мы получим медианные «n/5» из 5. –
После немного более продуманного, похоже, что у Википедии может быть не самая эффективная версия с пространственной эффективностью. Причина, по которой он не использует пространство для стека, заключается в том, что он не нужен, если вы конвертируете его из рекурсивного в итеративный. Взгляните на итеративные версии quickselect, и вы заметите, что нет стека, поскольку это можно сделать только с помощью циклов. Однако для быстрой сортировки нужен стек (неявно или явно). – Nuclearman