【发布时间】:2015-06-29 14:18:27
【问题描述】:
不使用位移,有什么方法可以在 O(n) 时间内计算 2^n?
我正在考虑使用记忆的解决方案,因为我总是先从较低的 n 开始计算。 即
d = dict()
def pwr2(n):
if n == 0:
return 1
if n == 1:
return 2
if n in d:
return d[n]
d[n] = 2 * pwr2(n-1)
return d[n]
但我不太确定复杂性是什么。
编辑:我应该补充一点,我正在使用算法的一部分以比 O(n^2) 时间更快的速度将二进制转换为十进制。作为我的分治算法的一部分,我必须乘以 2 的幂次方,这就是我尝试记忆的原因。
EDIT2:在这里发布我的完整算法以帮助解决混淆 pwr2dict = dict()
def karatsuba(x, y):
// use karatsuba's algorithm to multiply x*y
def pwr2(n):
if n == 0:
return 1
if n == 1:
return 2
if n in pwr2dict:
return pwr2dict[n]
pwr2dict[n] = karatsuba(pwr2(n-1),2)
return pwr2dict[n]
def binToDec(b):
if len(b) == 1:
return int(b)
n = int(math.floor(len(b)/2))
top = binToDec(b[:n]) # The top n bits
bottom = binToDec(b[n:]) # The bottom n bits
return bottom + karatsuba(top, pwr2(len(b)-n))
print binToDec("10110") // Prints 22
【问题讨论】:
-
你的记忆解决方案的复杂性与没有记忆的解决方案相同,因为没有结果被重用。但是,如果乘法是常数时间,那么两者仍然是 O(n)。 (不是。)
-
你的分治算法是什么?也许最好问问这个。
-
如果 O(n) 中的 n 是 2^n 中 n 的位数,那么您实际上要求的是 O(log n) 算法。或者换句话说,一种在 O(n) 时间内计算 2^k 的算法,其中 n 是 k 中的位数
-
这是一个关于 Python 的问题,还是抽象的?如果是抽象的,您使用的是什么计算模型?
-
如果是抽象的,您使用的是什么 RAM 模型?字节? bigints 应该如何表示?例如,如果您选择表示为带有符号位的字节数组,那么答案很容易为 O(n),因为您可以直接构造结果而无需进行任何乘法运算。
标签: algorithm big-o memoization