c语言pow时间复杂度,为什么pow(x,y)的时间复杂度是O(1),而x**y的时间复杂度是O(n)?...

这种说法是错误的。在pow或多或少与{}相同。在

pow和{}如果参数是整数,则执行整数求幂。(Python3有自动的bignum支持,因此,例如,a ** b总是给出精确的积分结果,即使a或b非常大。)这需要O(log(b))乘法,并通过平方求幂,但是bignum乘法不是恒定时间,因此时间复杂度取决于所使用的乘法算法的细节。(另外,Python并不完全使用平方求幂,但是Python使用的仍然是O(log(b))乘法)

^另一方面,{}则不同。它总是进行浮点求幂,并且总是O(1)。这种O(1)复杂性并不是因为它比pow或**更有效;而是因为浮点牺牲了精度和范围。对于整数求幂的非常复杂的情况,math.pow将给出更不精确的结果,或者抛出一个OverflowError。在

进一步的细节(从查看堆栈溢出的otherquestions,以及在Python源代码中插入一点):pow(参见here)和{}(参见here)都调用相同的PyNumber_Power函数。实际上,**可以更快,因为它避免了额外的符号查找和函数调用的开销。在

pow/**的整数实现可以看到here。在

^另一方面,{}总是调用C库的pow函数,它总是进行浮点运算。(参见here和here)这通常更快,但并不精确。请参见here,了解pow的一种实现方式。在

对于浮点数,pow/**还调用C库的pow函数,因此没有区别。请参见here和here。在

如果您想自己玩,可以将这些命令粘贴到IPython会话中:import timeit

def show_timeit(command, setup):

pri

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值