阶乘时间算法O(n!)的示例

rec*_*nja 35 algorithm complexity-theory factorial time-complexity

我正在研究学校的时间复杂度,我们的主要关注点似乎是多项式时间 O(n^c)算法和准线性时间 O(nlog(n))算法,偶尔的指数时间 O(c^n)算法作为运行时透视的一个例子.然而,从未涉及处理更大的时间复杂性.

我想看一个在阶乘时间内 运行的算法解决方案的示例问题O(n!).该算法可能是一种解决问题的简单方法,但不能人为膨胀以在因子时间运行.

如果因子时间算法是解决问题的最着名的算法,则额外的街道信誉.

zw3*_*324 43

生成列表的所有排列

你有n!列表,所以你不能达到更好的效率O(n!).

  • @ ziyao-wei列出一组的所有组合是2 ^ n.请参阅:http://en.wikipedia.org/wiki/Combination#Number_of_k-combinations_for_all_k.也许你的意思是列出所有的排列?即给定n个项目,它们可以在n长度的字符串中排序/置换多少种方式? (5认同)
  • 这实际上不会比“O(n * n!)”更好,因为你有“n!”列表,并且每个列表中有“n”个东西。 (2认同)

Zim*_*oot 18

旅行推销员有一个天真的解决方案是O(n!),但它有一个动态编程解决方案是O(n ^ 2*2 ^ n)


gre*_*pit 7

这是一个使用 Big O( n! ) 的简单示例:

这是Python 3.4中的

 def factorial(n):
    for each in range(n):
        print(n)
        factorial(n-1)
Run Code Online (Sandbox Code Playgroud)


arc*_*hie 5

列出数组的所有排列是O(n!).下面是使用swap方法的递归实现.递归在for循环中,并且数组中的元素在位置交换,直到不再有元素为止.从结果计数中可以看出,数组中的元素数是n!.每个排列都是一个操作,有n个!操作.

def permutation(array, start, result)
    if (start == array.length) then
        result << array.dup  
    end
    for i in start..array.length-1 do
        array[start], array[i] = array[i], array[start]
        permutation(array, start+1,result)
        array[start], array[i] = array[i], array[start]
    end 
    result   
end        


p permutation([1,2,3], 0, []).count  #> 6 = 3!
p permutation([1,2,3,4], 0, []).count #> 24 = 4!
p permutation([1,2,3,4,5], 0, []).count #> 120 = 5!
Run Code Online (Sandbox Code Playgroud)