web-dev-qa-db-ja.com

すべての組み合わせを生成するときの複雑さ

「これは、配列要素のすべての可能な組み合わせを生成することで解決できる可能性があります」で始まるインタビューの質問は、通常、より良いものを見つけることを目的としています。

とにかく、「これはO(X)なので、間違いなく別のソリューションを好む」を追加したいと思います。質問は、次のとおりです。O(X)与えられたセット?

私はnがあることを知っています! /(n-k)!k!組み合わせ(二項係数)ですが、そこからbig-O表記を取得するにはどうすればよいですか?

13
Albert

まず、O(n! / (n-k)!k!)-または他の関数f(n)O(f(n))として使用しても問題はありませんが、それでも保持できるより単純なソリューションを探していると思います。同じセット。

サブセットkのサイズを定数として見たい場合は、

k <= n-kの場合:

_n! / ((n-k)!k!) = ((n-k+1) (n-k+2) (n-k+3) ... n ) / k! 
_

しかし、上記は実際には_(n^k + O(n^(k-1))) / k!_であり、これはO(n^k)にあります。

同様に、_n-k<k_の場合、O(n^(n-k))を取得します。

これにより、O(n^min{k,n-k})が得られます

21
amit

@amitのフォローアップとして、min {k、n-k}の上限はn/2です。

したがって、「nchoose k」の複雑さの上限はO(n ^(n/2))

3
Abdu

私はこれが古い質問であることを知っています、しかしそれはグーグルでトップヒットとして出てきます、そして私見は間違ってマークされた受け入れられた答えを持っています。

C(n,k) = n Choose k = n! / ( (n-k)! * k!)

上記の関数は、n要素のセットから作成できるk要素のセットの数を表します。純粋に論理的推論の観点から、C(n, k)はより小さくなければなりません

∑ C(n,k) ∀ k ∊ (1..n)

この式は べき集合 を表すためです。英語では、上記の式はadd C(n,k) for all k from 1 to nを表します。これには_2 ^ n_要素があることがわかっています。

したがって、C(n, k)の上限は_2 ^ n_であり、これは_n ^ k_の_n, k > 3, and k < n_よりも明らかに小さい値です。

それであなたの質問に答えるためにC(n, k)は確かに_2 ^ n_の上限を持っています、しかしそれをよりよく説明するより厳しい上限があるかどうかわかりません。

1
Vikhram