Этот вопрос затрагивает один из более тонких аспектов нотации big-O: модель стоимости .
Когда мы думаем о том, сколько «шагов» будет выполнять определенный алгоритмЧтобы выполнить задачу, нам нужно решить, что мы можем сделать за один шаг.В большинстве случаев люди принимают модель затрат, когда любая базовая инструкция, такая как сравнение, базовая арифметическая операция или вызов функции, стоит 1 шаг.Это полезное упрощение, даже если на реальных компьютерах выполнение этих операций может занимать разное количество времени, в зависимости от факторов, которые не учитываются моделью (например, добавляем ли мы два числа в регистры, в кэш, в основную память,на диске?), потому что это позволяет нам думать о том, как программа масштабируется до больших входов, не суетясь о слишком большом количестве деталей.
Однако в некоторых приложениях подходят разные модели затрат: например, при написании сетевого программного обеспечения вы можете посчитать передачу по сети как один шаг, а любые вычисления, которые происходят на одном узле, являются бесплатными, независимо оталгоритм.Точно так же было бы полезно проанализировать алгоритмы, разработанные для хорошей работы с локальностью памяти, основываясь на том, сколько раз им нужно читать из основной памяти, игнорируя стоимость любой работы, которую они выполняют с тем, что они читают.Ни один из этих подходов не является «правильным» - они все измеряют абстрактное, вымышленное число - но они могут быть полезны для разных вещей.
Итак, чтобы ответить на ваш вопрос напрямую: является ли этот алгоритмO (1) или O (n) зависит от модели затрат.Если вы решите, что начальные потоки свободны и что одна операция с любым количеством потоков считается одним шагом, тогда да, это O (1).Если вы решите, что запуск потока стоит единицы работы или что операция с одним потоком считается единицей работы, то это O (n).Какая модель затрат подходит для ваших целей, зависит от вопроса, на который вы хотите ответить.
(Будучи немного менее скромным, я бы сказал, что первая модель затрат не кажется мне такой уж полезной, поскольку яЯ не знаю ни одной ситуации, в которой я хотел бы предположить, что у меня может быть столько процессоров, сколько мне нужно, или что затраты на выполнение работы незначительны, но, возможно, если бы я анализировал алгоритм обработки данных с большим MapReduceкластер или что-то, что имело бы смысл.)