我正在尝试分析递归算法的时间复杂性,该递归算法求解了在锤距t问题中生成的所有位序列。算法是:
// 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("%sn", 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);
}
该算法的时间复杂性是多少?
当涉及到这一点时,我很喜欢自己生锈,这是我的尝试,我觉得这不是事实:
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)
其中 n
是位字符串的长度。
相关问题:1,2。
它是指数:
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,但是您正在进行两个递归电话。您的递归呼叫正在形成二进制树。