如何解决对于大数而言,以下求幂的分治式递归算法是否比迭代算法更有效?
我有以下两种算法。我的分析说,他们两个都是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)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。