Нет.факториальное время не является полиномиальным временем.Полиномиальное время обычно означает уравнение вида O (N k ), где N = количество обрабатываемых элементов, а k = некоторая постоянная.Важная часть заключается в том, что показатель степени является константой - вы умножаете N на некоторое число, которое является фиксированным, не зависящим от самого N.Алгоритм факториальной сложности означает, что число умножений не фиксировано - число умножений само увеличивается с N.
У вас, похоже, такая же проблема здесь,N 2 будет полиномиальной сложностью.2 N не будет.Ваш основной принцип также ошибочен - алгоритм факториальной сложности не означает «у нас достаточно быстрый алгоритм», по крайней мере, как общее правило.Во всяком случае, вывод скорее противоположный: факторный алгоритм может быть практичным в нескольких особых случаях (т. Е., Когда N чрезвычайно мал), но становится непрактичным очень быстро с ростом N.
Давайте попробуем представить это в перспективе.Двоичный поиск - это O (log N).Линейный поиск O (N).При сортировке «медленными» алгоритмами являются O (N 2 ) и «продвинутыми» алгоритмами O (N lg N).Сложность факториала (очевидно, достаточно) O (N!).
Попробуем привести к этому некоторые цифры, учитывая (на данный момент) только 10 пунктов.Каждое из них будет примерно в сколько раз дольше обрабатываться для 10 элементов вместо 1 элемента:
O (log N): 2
O (N): 10
O (N logN): 23
O (N 2 ): 100
O (N!): 3 628 800
На данный момент я немного обманул и использую натуральныйлогарифм вместо логарифма с основанием 2, но мы здесь пытаемся только приблизительные оценки (и разница в любом случае является довольно небольшим постоянным фактором).
Как видите, скорость роста для факториала-сложность алгоритма на намного быстрее, чем для любого другого.Если мы расширим его до 20 пунктов, разница станет еще более существенной:
O (log N): 3
O (n): 20
O (N log N): 60
O (N 2 ): 400
O (N!): 2 432 902 008 176 640 000
Скорость роста для N!настолько быстры, что они практически гарантированно будут непрактичными, за исключением случаев, когда количество элементов включает , о которых известно, что довольно мало.Для ухмылки, давайте предположим, что основные операции для процессов, описанных выше, могут выполняться в одном цикле машины.Просто ради аргумента (и для простоты расчетов) давайте предположим, что процессор 10 ГГц.Итак, база в том, что на обработку одного элемента уходит 0,1 нс.В этом случае с 20 элементами:
O (log N) = .3 нс
O (N) = 2 нс
O (N log N) = 6 нс
O (N 2 ) = 40 нс
O (N!) = 7,7 года.