Википедия перечисляет алгоритм медианы медианов как требующий вспомогательное пространство 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)
на странице Википедии.)