Если у меня есть алгоритм, который принимает n log n шагов (например, heapsort), где шаги занимают log n времени (например, сравнение / обмен "больших" целых чисел в диапазоне от 0 до n-1), что такое асимптотика на весь процесс.
Очевидно, что мы можем сказать «n (log n) (log n)», но я с трудом пытаюсь убедить себя, что не могу упростить это до «n log n». В то же время мне трудно оправдать инстинкт, который настаивает на том, что я могу.
Мой инстинкт просто неправ в этом?
EDIT
Кажется, мой простой пример, который нужно избегать, усложнил проблему. Ну хорошо.
Реальная причина этого вопроса в том, что у меня часто есть стандартный алгоритм с известной сложностью, но реализованный с использованием различных базовых контейнеров, так что отдельные шаги - это O (log n), а не O (1). Например, алгоритм минимизации автомата Хопкрофта - это O (n log n), но если вы начнете использовать контейнеры двоичного дерева для состояний, переходов и промежуточных результатов, сами шаги станут O (log n) - O (n log n) будет больше не действителен, поскольку допущение O (1) обращений недопустимо.
Тем не менее, люди будут утверждать, что существует n состояний и m переходов, но n и m имеют тенденцию быть линейно связанными для автоматов, предполагая, что число аннотаций переходов является постоянным и что автоматы являются более или менее детерминированными.
В прошлом я не слишком беспокоился об этом - случаи, с которыми я работаю, не очень велики. Но, в общем, я делаю серьезный рефакторинг своего кода автомата, и я подумал, что с таким же успехом мог бы выполнять математические вычисления для некоторых ключевых алгоритмов.
EDIT
Я также все больше убеждаюсь, что «n (log n) (log n)» неверно.
Если a - это O (b log b), где b - это O (log c), что такое a в терминах c?