web-dev-qa-db-ja.com

階乗時間アルゴリズムの例O(n!)

私は学校で時間の複雑さを研究していますが、私たちの主な焦点は多項式時間O(n^c)アルゴリズムと準線形時間O(nlog(n))臨時の指数時間O(c^n)アルゴリズムを実行時の例として使用するアルゴリズム。しかし、より大きな時間の複雑さに対処することは決してカバーされませんでした。

factorial timeO(n!)で実行されるアルゴリズムソリューションの問題の例をご覧ください。アルゴリズムは問題を解決するための単純なアプローチかもしれませんが、要因時間で実行するために人為的に肥大化することはできません。

要因時間アルゴリズムが問題を解決するための最もよく知られたアルゴリズムである場合、余分なストリートクレディ。

32
recursion.ninja

リストのすべての順列を生成する

_n!_リストがあるため、O(n!)よりも効率を上げることはできません。

41
zw324

Traveling Salesman にはO(n!)の素朴なソリューションがありますが、O(n ^ 2 * 2 ^ n)の動的プログラミングソリューションがあります

17

配列のすべての順列は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!
5
archie

Big O(n!)を使用した簡単な例を次に示します。

これはpython 3.4

 def factorial(n):
    for each in range(n):
        print(n)
        factorial(n-1)
2
grepit