このアルゴリズムの時間の複雑さは何ですか?なぜ?


8

次のアルゴリズムの時間の複雑さを分析することに行き詰まっています。

def fun (r, k, d, p):
    if d > p:
        return r
    if d = 0 and p = 0:
        r <- r + k
        return r
    if d > 0:
        fun (r, k + 1, d - 1, p)
    if p > 0:
        fun (r, k - 1, d, p - 1)

ルートの呼び出しは次のようになりますfun (0, 0, n, n)し、n問題の大きさです。

再帰関係はT(n,n)=T(n−1,n)+T(n,n−1)であり、T (2 n )= 2 T (2 n − 1と同等))T(2n)=2T(2n−1)⟺T(m)=2T(m−1)なので、O(2m)⟺O(4n)。

私の分析は正しいですか(私はそれが非常に完全かつ正確ではないことを知っています)?深刻な欠陥がある場合は、指摘するか、このアルゴリズムの時間の複雑さについての正確かつ完全な証拠を示してください。


1
xando、質問を編集して、標準的な手法が機能しない理由を説明することをお勧めします。なぜ失敗するのかを説明してください。(Cc:@YuvalFilmus)たとえば、解決するのが難しい再帰関係を取得しますか?その場合、どのような再帰を取得しますか?
— DW

1
あなたがするアルゴリズムのために何を意味するか明らかではない、とき両方:Polyergicとのコメントの中で、私は擬似コードが不明であることに気づきましたd>0とp>0。3番目と4番目のifステートメントに到達した場合、関数が何を返すかは示していません。?をreturn再帰的に呼び出すたびにステートメントがあるということfunですか?(もしかしてfun (r, k + 1, d - 1, p)ことreturn fun (r, k + 1, d - 1, p)?)またはあなたが持っている意味したreturn関数本体の最後に文を?疑似コードを編集して明確にし、考えられるすべての場合にこれが何を返すかを確認してください。
— DW

別の言い方をするとd<=p、仮に、d>0そしてp>0すべてが成立するとします。何が起こるはずですか?アルゴリズムは関数に対して2回の再帰呼び出しを行いますか?またはfun(r, k + 1, d - 1, p)、再帰的に呼び出すことなく、再帰的に呼び出してすぐに戻るのfun(r, k - 1, d, p - 1)ですか?私があなたの疑似コードを文字通りに受け取った場合、それは2つの再帰呼び出しを行ってから未定義の戻り値で戻るように見えます-しかしそれは奇妙に思え、疑似コードにタイプミス/バグがあるのではないかと思います。
— DW

回答:


10

dpd,p≥0d≤p(d,p)(d−1,p),(d,p−1)、上記の制約を無効にするペアを避けます。

我々が始まるパスとして得られたコールツリーを描くことができる。pを減らすたびに、/ステップを追加します。dを減らすたびに、\ステップを追加します。条件D ≤ p個のあなたはX軸の下に行くことはありませんことを保証します。さらに、各ステップのn個の「予算」があります。この呼び出しツリーのリーフの総数は、正確にカタロニア語の数であり、これにより、関数の実行時間の下限。(0,0)pdd≤pn(2nn)/(n+1)=Θ(4n/n3/2)

上限を取得するには、各葉への途中でノードを通過することに注意してください。これにより、上限よりも上限が大きくなりますつまり、。2 、N Θ (4 N / √2n2nΘ(4n/n)

我々は、以下の結合したと上部に結合された。正確な漸近は何ですか?それらは、X軸を横切らず、各方向に最大ステップのパスの総数のように成長します。ベルトランの投票定理を使用して、これの正確な式を得ることができます: したがって、この合計を漸近的に推定する必要があります。 O (4 N / √Ω(4n/n3/2)N Σ 0 ≤ D ≤ P ≤ N P - D + 1O(4n/n)nΣ0≤D≤P≤N( P+D

∑0≤d≤p≤np−d+1p+1(p+dp).
∑0≤d≤p≤n(p+dp)−∑0≤d≤p≤ndp+1(p+dd)=∑0≤d≤p≤n(p+dp)−∑0≤d≤p≤n(p+dp+1)=∑p=0n(2p+1p+1)−∑p=0n(2p+1p+2)=∑p=0n1p+1(2p+2p)=Θ(∑p=0n4pp3/2)=Θ(4nn3/2).

1
私はこれらの「ステップ」を使用した幾何学的アプローチが本当に好きです。それは一般的なテクニックですか?今まで見たことがありません。
— Andreas T

@AndreasT私はそれを一般的な手法とは呼びません。実際、通常は適用されません。ここで組み合わせの解釈はかなり明白であり、それがこの種の解決策につながります。
— Yuval Filmus、2015年

0

ケースバイケース:

  1. d> p:一定時間
  2. d = 0∧p = 0:一定時間
  3. d> 0:d≯pであることに注意してください。0< fund≤pであり、d -1でd≯0まで再帰します。p> 0なので、これはd +(ケース4)では線形です。
  4. p> 0:d≯0なので、d≤0≤p(d <pの場合)であり、funp have 0までp-1で再帰します。これはp +の線形(ケース1、2、または5のいずれか)
  5. d≤p <0:未定義。これは一定時間だと思います

d = p = n> 0で始まり、ケース3にヒットし、その後にケース4が続きます。nが整数の場合、最終ケースは2で、それ以外の場合、最終ケースは5です。これらのケースの合計時間はd + pです。 +1、または2n + 1。


2n。私は推論に集中したのであなたは反対票を投じたと思いますか?
— ShadSterling

1
回答を編集していただきありがとうございます。ここでのパズルは、実行時間がであると結論付けたことですが、Yuvalは実行時間が指数関数であると結論付けました。これはかなりの違いです。nO(n)n
— DW

1
うーん、私は疑似コードifsを「これらの1つを実行する」と見なし、@ Yuvalは「これらを順番に検討する」と見なしました。後者はもちろん、実際のコードではifs(なしelse)の意味です。私は、実際のコード以外のほとんどすべてのコンテキストで前者に慣れています(擬似コードでの使用を含みますが、擬似コードでの使用を含みます)。
— ShadSterling

あなたの言っていることがわかります。returnコードの後半にステートメントがないため、これはかなり混乱します。
— DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.