C++ 给定递归表达式,求空间复杂度为O(1)的算法
我的任务是根据以下简单表达式编写一个算法:C++ 给定递归表达式,求空间复杂度为O(1)的算法,c++,algorithm,recursion,C++,Algorithm,Recursion,我的任务是根据以下简单表达式编写一个算法: f (0) = 0, f (1) = 1, f (2n) = f (n), f (2n + 1) = f (n) + f (n + 1). 这些限制是:时间复杂度O(logn),空间复杂度O(1)。 我编写了这个基本的递归函数: int func (int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } if (n
f (0) = 0, f (1) = 1, f (2n) = f (n), f (2n + 1) = f (n) + f (n + 1).
这些限制是:时间复杂度O(logn),空间复杂度O(1)。
我编写了这个基本的递归函数:
int func (int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (n % 2 == 0) {
return func(n / 2);
} else {
return func(n / 2) + func((n / 2) + 1);
}
}
使用迭代算法可能会有更聪明的方法,因为我需要O(1)空间复杂性(因为递归调用,我认为我的代码不是O(1)空间)。此序列是Stern的双原子序列,您得到的函数称为
fusc(n)
计算O(logn)时间和O(1)空间复杂度的一种方法是在Calkin-Wilf树中找到第n个值。该值的分子将是fusc(n)
。您可以在维基百科页面上阅读一些背景资料:
下面是一些代码,用于检查快速版本的幼稚fusc
实现。它是在Python中,但是转换成C++是微不足道的。
def fusc(n):
if n < 2:
return n
if n%2 == 0:
return fusc(n//2)
return fusc(n//2) + fusc(n//2+1)
def fast_fusc(n):
if n == 0: return 0
top = 1
while top <= n:
top <<= 1
top >>= 1
a, b = 1, 1
while top > 1:
top >>= 1
if n & top:
a, b = a + b, b
else:
a, b = a, a + b
return a
for i in xrange(100):
assert fusc(i) == fast_fusc(i)
def fusc(n):
如果n<2:
返回n
如果n%2==0:
返回fusc(n//2)
返回fusc(n//2)+fusc(n//2+1)
def fast_fusc(n):
如果n==0:返回0
top=1
而前1名:
顶部>>=1
如果不在顶部(&T):
a、 b=a+b,b
其他:
a、 b=a,a+b
归还
对于X范围内的i(100):
断言fusc(i)=fast\u fusc(i)
您可以看到,在
fast\u fusc
中,top
迭代n
的位,因此代码执行O(logn)算术运算。因为只使用了4个变量(n
,a
,b
,top
),所以它使用了O(1)空间。注意,对于偶数参数,可以将其除以2,直到奇数为止,然后才调用函数。对奇数参数应用相同的逻辑。我回答的可能是重复的,但随后搜索重复并找到了一个。请注意,公认的答案很差,但提供的解决方案比我的简单一点。