python - 更快地替代嵌套 for 循环时间
问题描述
我需要计算/从由以下组成的可能整数列表中
i + 2j + k,其中 1 <= i,j,k <= N。
我知道这将是从 4 到 4N 的所有整数,但我也需要它们的频率,因此必须制定一个列表。我也找不到频率的模式。我的蛮力方法是:
对于 n = 2,列表将类似于:[4,5,6,5,7,6,7,8]
for i in range(N+1):
for j in range(N+1):
for k in range(N+1):
#creating a list
否则有模式吗?就像如果i + 2j + k = P,P的频率= P形式的某个方程。据我尝试,没有找到任何线性或二次方程。
它的复杂性是 O^3,所以我需要一个更好的版本/替代品。我对想法持开放态度。如果您有什么不明白的地方,请询问。
解决方案
由于 noboding 发布了一个线性解决方案(我相信有一个),我将发布一个二次解决方案:
def ways(n,N):
s=0
s1 = 0
s2 = 0
for j in range(1,N+1):
if n - 2*j < 2:
break
if n - 2*j > 2*N:
continue
s1+= min(n-2*j - 1,N) +1
s2+= max(n-2*j-N, 1)
return s1 - s2
N=2
print({ i: ways(i,N) for i in range(4, 4*N+1) })
输出:
{4: 1, 5: 2, 6: 2, 7: 2, 8: 1}
至少从 O(N^3) 到 O(N^2) 的改进。
推荐阅读
- javascript - Barba.js 上滑动画故障
- sql - 在代码中没有提到其他数据库的情况下触发从其他数据库获取数据?如何?
- flutter - 如何在颤动中从 JSON 对象中提取键和值
- terraform - 使用 terraform 为现有虚拟机启用 Azure Monitor
- powershell - 加速Powershell
- r - 转换数据框中的原始向量列表
- node.js - 在 AWS lambda 上设置 https 代码使用 NodeJS
- python - PDF python文本编码错误
- reactjs - Firebase - set() 不会更改值,而是创建新文档
- python - 如何根据 Python 中另一个列表的(子列表)索引对列表进行分区