数に等しい二項係数を見つけることの複雑さ


19

バイナリエンコーディングでビットを使用して)数値取得していると仮定します。O log m mO(logm)

どれだけ速く見つけることができますか(またはそのようなものが存在しないと判断します

n,kN,1<kn2:(nk)=m

たとえば、入力m = 8436285が与えられた場合、n = 27、k = 10をm=8436285出力できます。n=27,k=10


問題の単純なアルゴリズムは、nのすべての可能な値を調べ、プロパティを満たすkのn値を検索します。k

簡単な観察は、\ log mより小さいまたはO(\ sqrt m)より大きいnの値をチェックする必要がないということです。ただし(n値ごとにO(1)可能なk値のみをチェックできたとしても)これは、入力サイズが指数関数的である非効率的なアルゴリズムになります。nlogmO(m)O(1)kn

別のアプローチは、kの可能な値kを調べて(\ {2,3、\ ldots、2 \ log m \}をチェックするのに十分です{2,3,,2logm})、n値をチェックするたびに行います。その後、次を使用できます:

(nk)k<(nk)<nkk!

したがって、与えられたkに対して、範囲[\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ cdot k!}、\ sqrt [\ leftroot {-2} \のn個のkのみをチェックする必要があります。 uproot {2} k] {m} \ cdot {k}]、バイナリ検索を使用して(kが固定されている場合、n \ choose knで単調に増加します)、これはO(\ log ^ 2m)n[mk!k,mkk]k(nk)nO(log2m)

これはまだ私には非効率的なようで、これは線形時間(入力サイズ)で解決できると思います。


4
これまでに何を試しましたか?ヒント:も与えられたと仮定します。これを解決できますか?の可能な値の範囲は?または、が与えられたと仮定します。その場合は解決できますか?の可能な値の範囲は?n k knnkk
DW

回答:


1

というのは正しくありません。例えば。 9(nk)k<(nk)(92)=36<49=(92)2

私は(まだ)二項係数の算術特性を使用した微妙な解決策を見つけていませんが、それが役立つ場合は、多少強引なものを提案できます:-)

各について、初期推定(たとえば)を取得し、Newton-Raphsonなどの分析手法を使用して解くことができます。を解き。に関する左辺の導関数はここで、は計算が簡単なディガンマ関数です。 。N K kn nはk!mk、NψN+1-ψN-K+1 nは(nk)m=0n ψ(ψ(n+1)ψ(nk+1))(nk)ψ

Newton-Raphson検索の複雑さは、関数とその導関数の計算の複雑さ、およびソリューションに必要な桁数のみに依存します(この場合、最も近い整数が必要です)。

だから、全体のそれぞれについて、探索があるべき(二項係数を計算すると、一定の時間を要すること、あなたが行っているように見えるとして、仮定した場合)、のために、あなたの限界を利用したアルゴリズムのためので、合計複雑なり。kO(1)kO(log(m))


2
私は境界がオフになっていることに同意しますが(編集を参照してください、ありがとう)、が取る場合、検索がなぜ行われるのか説明できますか?kO(1)
RB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.