问题描述
我有以下两种算法。我的分析说,他们两个都是O(m ^ 2 + 4 ^ n),也就是说,它们对于大数是等效的。这是正确的吗?。请注意,m
和n
是x
和y
def pow1(x,y):
if y == 0:
return 1
temp = x
while y > 1:
y -= 1
temp *= x
return temp
def pow2(x,y):
if y == 0:
return 1
temp = pow2(x,y//2)
if y & 1: return temp * temp * x
return temp * temp
解决方法
分而治之算法是否更有效取决于许多因素。在Python中效率更高。
您的分析是正确的;假设采用标准的小学倍乘,则分治法将进行更少,更昂贵的乘法,并且渐近地使总运行时间变得容易(恒定因素可能很重要-我仍然猜想分治法会更快,因为大多数这项工作发生在优化的C中,而不是Python循环开销中,但这只是预感,鉴于Python不使用基本乘法算法,因此很难进行测试。
在进一步介绍之前,请注意Python中的大整数乘法为m ^ 2的little-o。特别是,它使用karatsuba,对于m位整数和m
使用普通乘法的小项渐近无关紧要,因此着眼于大项,我们可以代替乘法成本,发现您的迭代算法在O(4 ^ nm ^ 1.58)左右,并且分治式解决方案约为O(3 ^ nm ^ 1.58)。