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)
。
結果は正しいアジズのように感じますが、直感を説明できますか?私はあなたがこの答えを作り出した方法を意味します。彼に魚を与えるだけでなく、魚を習う人を学ぶ! :D – gsamaras
この反復関係を解くこの方法は、「伸縮」と呼ばれます。あなたは、あなたが関係のパターンを(特定のステップ 'i'のために)決めることができるまで、基本的に関数t(n)を繰り返し置き換えます。次に、t(0)を使って最終ステップを決定することができます。これは解です。 – Aziz
おかげさまで、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