python - 仅使用总和将 2 提高到 n 次方的最有效算法?
问题描述
以下算法需要 O(n) 时间。这可以改进吗?
def powerOfTwo(n):
a = 1
if (n>0):
a=2
while (n>1):
a=(a+a)
n=(n-1)
return a
解决方案
如评论中所述(并由@Mark Ransom 指出),您可以将代码简化为:
def powerOfTwo(n):
a = 1
for _ in range(n):
a += a
return a
除非您预先计算2^n
了 differentn
的值,否则您无法2^n
仅使用小于 O(n) 的求和运算来计算。
证明
让我们证明一下。假设有用于计算的k
初始值a[i]
(在您的示例中为 ) 。k=1
2^n
然后,在第一次迭代中,你做了一些m
添加。因此,您可以获得的最大数量是max(a[i])*m
。在第二次迭代中,您m
再次进行加法,最大数量是max(a[i])*m*m
等等。
我们需要达到多少次循环迭代2^n
?为此,我们需要解决一个不等式:
max(a[i])*(m^l) >= 2^n | take log from both sides
->
log(max(a[i])*(m^l)) >= n
->
log(max(a[i]) + log(m^l) >= n |
->
log(m^l) >= n - log(max(a[i]) | exclude log(max(a[i]) because it's constant
->
log(m^l) >= n
->
l*log(m) >= n
->
l >= n / log(m)
迭代次数l
线性取决于n
因为log(m)
是有限数。因此,时间复杂度保持为 O(n)。
推荐阅读
- xamarin.forms - 点击背景上的 Xamarin 表单选择器
- python - Python循环中的变量不是块作用域吗?
- node.js - MongoDB `updateOne()` 返回的文档实际记录在哪里?
- spring - 微服务间通信部分失败如何处理?
- python - 在 Python 中使用 pandas 在现有 excel 中添加多个工作表
- reporting-services - 报告标题在 SSRS 报告的新页面上不可见
- ios - 如何将过滤器应用于照片库中的选定图像,而不仅仅是硬编码的图像
- unity3d - 每次发生碰撞时如何继续协程功能?
- java - 如何在每个列表视图中显示内容
- javascript - 语音到带有波浪头像的文本