2016-12-10 16 views
2

Generate all sequences of bits within Hamming distance t問題を解決する再帰アルゴリズムの時間複雑度を分析しようとしています。アルゴリズムは次のとおりです。2つの再帰呼び出しによる再帰アルゴリズムの時間複雑度

// str is the bitstring, i the current length, and changesLeft the 
// desired Hamming distance (see linked question for more) 
void magic(char* str, int i, int changesLeft) { 
     if (changesLeft == 0) { 
       // assume that this is constant 
       printf("%s\n", str); 
       return; 
     } 
     if (i < 0) return; 
     // flip current bit 
     str[i] = str[i] == '0' ? '1' : '0'; 
     magic(str, i-1, changesLeft-1); 
     // or don't flip it (flip it again to undo) 
     str[i] = str[i] == '0' ? '1' : '0'; 
     magic(str, i-1, changesLeft); 
} 

このアルゴリズムの時間複雑度はどのくらいですか?


自分はかなり錆び私が好きそれはこれに来て、ここで私は真実の近くに場所ではありません感じる私の試み、あるとき:nは、ビット列の長さである

t(0) = 1 
t(n) = 2t(n - 1) + c 
t(n) = t(n - 1) + c 
    = t(n - 2) + c + c 
    = ... 
    = (n - 1) * c + 1 
    ~= O(n) 

関連する質問:12

答えて

5

それは、指数です:

t(0) = 1 
t(n) = 2 t(n - 1) + c 
t(n) = 2 (2 t(n - 2) + c) + c   = 4 t (n - 2) + 3 c 
    = 2 (2 (2 t(n - 3) + c) + c) + c = 8 t (n - 3) + 7 c 
    = ... 
    = 2^i t(n-i) + (2^i - 1) c   [at any step i] 
    = ... 
    = 2^n t(0) + (2^n - 1) c   = 2^n + (2^n - 1) c 
    ~= O(2^n) 

または、WolframAlphaを使用して:それは指数関数的だhttps://www.wolframalpha.com/input/?i=t(0)%3D1,+t(n)%3D2+t(n-1)+%2B+c

理由は、あなたの再帰呼び出しが1で、問題のサイズを小さくしているが、あなたは、2つの再帰作っているということですコール。あなたの再帰呼び出しはバイナリツリーを形成しています。

+0

結果は正しいアジズのように感じますが、直感を説明できますか?私はあなたがこの答えを作り出した方法を意味します。彼に魚を与えるだけでなく、魚を習う人を学ぶ! :D – gsamaras

+0

この反復関係を解くこの方法は、「伸縮」と呼ばれます。あなたは、あなたが関係のパターンを(特定のステップ 'i'のために)決めることができるまで、基本的に関数t(n)を繰り返し置き換えます。次に、t(0)を使って最終ステップを決定することができます。これは解です。 – Aziz

+0

おかげさまで、Azizは非常に多くの場合、式に 'changesLeft'を何とか導入するべきではありませんか?私は[iterative versionで、私たちは](http://stackoverflow.com/questions/41086928/time-complexity-of-anative-algorithm)という意味で、そこに 'dist'と呼ばれています(私はそれらを比較しようとしています理論的に)。与えられた 'changesLeft'(' n'は 'changesLeft'を選択します)の時間に、このコード行に到達することを知っています:' printf( "%s \ n"、str); '。私は[関連する質問](http://stackoverflow.com/questions/41105621/trying-to-compare-a-recursive-and-iterative-algorithm)を投稿しました。時間があるなら、見てください! :) – gsamaras

関連する問題