Не существует алгоритма, который мог бы определить сложность программы [вообще].Это часть проблемы остановки - вы не можете определить, остановится ли определенный алгоритм или нет.[Вы не можете оценить, является ли оно Theta(infinity)
или чем-то меньшим, чем оно]
Как правило - обычно O(n!)
алгоритмы вызывают рекурсивный вызов в цикле с уменьшающимся диапазономв то время как O(2^n)
алгоритмы вызывают рекурсивный вызов дважды в каждом вызове.
Примечание : не все алгоритмы, которые дважды вызывают рекурсивный вызов, являются O(2^n)
- быстрая сортировка является хорошим примером дляO(nlogn)
алгоритм, который также дважды вызывает рекурсивный вызов.
РЕДАКТИРОВАТЬ: Например:
SAT решение для перебора O(2^n)
:
SAT(formula,vars,i):
if i == vars.length:
return formula.isSatisfied(vars)
vars[i] = true
temp = SAT(formula,vars,i+1) //first recursive call
if (temp == true) return true
vars[i] = false
return SAT(formula,vars,i+1) //second recursive call
Найти все перестановки: O(n!)
permutations(source,sol):
if (source.length == 0):
print sol
return
for each e in source:
sol.append(e)
source.remove(e)
permutations(source,sol) //recursive call in a loop
source.add(e)
sol.removeLast()