Алгоритмы с факторным временем и P/NP

Это довольно легко увидеть, что n! растет медленнее, чем почти что-либо в степени N (скажем, 100 ^ N), и поэтому, если проблема считается NP-полной и одна возникла на n! алгоритм, который аппроксимирует решение, можно было бы танцевать Снупи.

У меня 2 вопроса по этой ситуации:

  1. Было бы н! алгоритм считать решением за полиномиальное время? Факториал, конечно, не является термином, возведенным в степень.
  2. Если найти n! решение означает, что у нас достаточно быстрый алгоритм, а поскольку n! растет быстрее, чем 2^N, значит ли это, что некоторые NP-полные задачи не нуждаются в алгоритмах эвристики/аппроксимации (за исключением неясных случаев)?

Конечно, эти два вопроса основаны на правильности первого абзаца; если я ошибся, пожалуйста, дайте мне знать.


person Zian Choy    schedule 04.06.2011    source источник
comment
н! растет быстрее, чем k^n. Учтите, раз n › k, то n! точно вырастет быстрее.   -  person Rafe    schedule 04.06.2011
comment
Я не понимаю ваш комментарий, потому что n! оценивается для некоторого значения n, такого что n больше, чем k, является единственным числом (пример: если k = 10, 10! = 3628800).   -  person Zian Choy    schedule 05.06.2011
comment
Рассмотрим первые 100 членов числа n! и 100^н. До этого момента 100^n росло быстрее, чем n! (т. е. каждый фактор был больше в 100 ^ n против n! - 1 против 100, 2 против 100, ...). Однако после этого момента каждое слагаемое в n! будет больше, чем соответствующий член в 100 ^ n (101 против 100, 102 против 100, ...).   -  person Rafe    schedule 06.06.2011


Ответы (2)


  1. Нет, факториальное время не является полиномиальным временем. Полиномиальное время обычно означает уравнение формы O(Nk), где N = количество обрабатываемых элементов, а k = некоторая константа. Важная часть заключается в том, что показатель степени является константой — вы умножаете N само на некоторое число, которое является фиксированным — не зависящим от самого N. Алгоритм факторной сложности означает, что число умножений не фиксировано — само число умножений растет с увеличением N.

  2. У тебя похоже такая же проблема. N2 будет полиномиальной сложностью. 2N не будет. Ваше основное правило также ошибочно: алгоритм факторной сложности не означает, что «у нас есть достаточно быстрый алгоритм», по крайней мере, как общее правило. Во всяком случае, вывод скорее противоположный: факторный алгоритм может быть практичным в нескольких особых случаях (например, когда N чрезвычайно мало), но становится непрактичным очень по мере роста N.

Попробуем представить это в перспективе. Бинарный поиск — это O(log N). Линейный поиск — O(N). При сортировке «медленные» алгоритмы — это O(N2), а «продвинутые» — O(N lg N). Факторная сложность равна (достаточно очевидно) O(N!).

Давайте попробуем подсчитать это, учитывая (на данный момент) только 10 пунктов. Каждый из них будет примерно во сколько раз дольше будет обрабатываться 10 элементов вместо 1 элемента:

O(log N): 2
O(N):10
O(N log N): 23
O(N2): 100
O(N !): 3 628 800

На данный момент я немного схитрил и использовал натуральный логарифм вместо логарифма по основанию 2, но мы здесь пытаемся только приблизительные оценки (и разница в любом случае является довольно небольшим постоянным фактором).

Как видите, скорость роста для алгоритма факторной сложности намного выше, чем для любого другого. Если мы расширим его до 20 элементов, разница станет еще более существенной:

O(log N): 3
O(n): 20
O(N log N): 60
O(N2): 400
O(N !): 2 432 902 008 176 640 000

Скорость роста для N! настолько быстры, что почти наверняка будут непрактичными, за исключением тех случаев, когда количество задействованных элементов известно, что они довольно малы. Для грима предположим, что каждая базовая операция для описанных выше процессов может выполняться за один машинный такт. Просто ради аргумента (и для простоты вычислений) давайте предположим, что у нас процессор с тактовой частотой 10 ГГц. Итак, в основе лежит то, что обработка одного элемента занимает 0,1 нс. В этом случае с 20 элементами:

O(log N) = 0,3 нс
O(N) = 2 нс
O(N log N) = 6 нс
O(N2) = 40 нс< br> O(N!) = 7,7 лет.

person Jerry Coffin    schedule 04.06.2011
comment
Большое спасибо за подтверждение моих внутренних ощущений. ›само число умножений растет с увеличением N. Чтобы было понятнее, поскольку даже алгоритм O(n) сделал бы это утверждение верным, увеличение размера выборки (n) увеличило бы количество умножений в ряду, который растет быстрее, чем что-либо, что полиномиальное время. (подробнее в другом комментарии) - person Zian Choy; 05.06.2011
comment
Re: Последняя часть комментария и моя ошибка по поводу ! против ^n Меня обманули! (Или, по крайней мере, я должен был посмотреть на графики WolframAlpha для больших значений X и Y; см. wolframalpha.com/input/?i=x%21+vs.+5%5Ex). Спасибо, что поправили меня. - person Zian Choy; 05.06.2011
comment
В течение многих лет у меня было странное заблуждение, что $O(n) ‹ O(n!) O(n^2)$. Теперь я вижу, насколько абсурдна эта идея. Спасибо, что прояснили ситуацию! - person Zaz; 05.10.2015

Довольно легко увидеть, что факториал (приблизительно) экспоненциален в поведении.

Его можно (очень грубо) представить как nn (точнее, sqrt(2n)(n/e)n).

Поэтому, если вы нашли какое-либо конкретное M, где, по вашему мнению, Mn является хорошим приближением, вы (вероятно) ошибаетесь. 269! больше 100n и как n! будет умножаться на числа больше 100, она будет продолжать расти быстрее.

person Vatine    schedule 04.06.2011
comment
+1 за приближение Стирлинга. Хотя, если вы не вывели его сами, вам, вероятно, следовало упомянуть его имя. :-) - person Nemo; 04.06.2011
comment
Да, при дальнейшем изучении даже сбивающий с толку график WolframAlpha (wolframalpha.com/input/?i=x%21+vs.+5%5Ex) показывает, что n! и 5^x являются более или менее переведенными версиями друг друга. - person Zian Choy; 05.06.2011
comment
@Nemo: Да, я обычно использую n ^ n как грубое приближение. - person Vatine; 05.06.2011