对于大数而言,以下求幂的分治式递归算法是否比迭代算法更有效?

问题描述

我有以下两种算法。我的分析说,他们两个都是O(m ^ 2 + 4 ^ n),也就是说,它们对于大数是等效的。这是正确的吗?。请注意,mnxy

的位数
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

getContext() method

解决方法

分而治之算法是否更有效取决于许多因素。在Python中效率更高。

您的分析是正确的;假设采用标准的小学倍乘,则分治法将进行更少,更昂贵的乘法,并且渐近地使总运行时间变得容易(恒定因素可能很重要-我仍然猜想分治法会更快,因为大多数这项工作发生在优化的C中,​​而不是Python循环开销中,但这只是预感,鉴于Python不使用基本乘法算法,因此很难进行测试。

在进一步介绍之前,请注意Python中的大整数乘法为m ^ 2的little-o。特别是,它使用karatsuba,对于m位整数和m

使用普通乘法的小项渐近无关紧要,因此着眼于大项,我们可以代替乘法成本,发现您的迭代算法在O(4 ^ nm ^ 1.58)左右,并且分治式解决方案约为O(3 ^ nm ^ 1.58)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...