用python计算嵌套和
我对编程和python都是新手,所以我想问你们一个通过编程计算双西格玛的简单方法 (∑ni=1)(∑mk=1)(i+k) 我正试图解决这个问题,但我被困在需要初始化p的部分,任何提示都会被忽略 这是我到目前为止试过的用python计算嵌套和,python,python-3.x,Python,Python 3.x,我对编程和python都是新手,所以我想问你们一个通过编程计算双西格玛的简单方法 (∑ni=1)(∑mk=1)(i+k) 我正试图解决这个问题,但我被困在需要初始化p的部分,任何提示都会被忽略 这是我到目前为止试过的 p = 1 sum = 0 N,M=[int(i) for i in input().split()] for i in range(1,N+1): for i in range(i+1,i+M+1): p=p*i sum += p print(
p = 1
sum = 0
N,M=[int(i) for i in input().split()]
for i in range(1,N+1):
for i in range(i+1,i+M+1):
p=p*i
sum += p
print(sum)
按照您的方法(不是运行时优化的),您需要在每次运行sum时重置表示内积的p
变量;因此,在每个外部循环的开始处将其设置为1
:
使用此方法和练习中给出的域,您将无法在给定的时间限制内计算更高的数字。您可能需要对此进行优化。按照您的方法(未优化运行时),您需要重置表示每次求和的内积的p
变量;因此,在每个外部循环的开始处将其设置为1
:
使用此方法和练习中给出的域,您将无法在给定的时间限制内计算更高的数字。您可能需要对此进行优化。考虑以下几点: 这意味着您天真的二次O(m*n)算法可以用线性O(m+n)解决方案代替:
In [1]: from hypothesis import strategies as st
...: from hypothesis import given, settings
...:
...:
...: def linear(n, m):
...: return n * sum(range(1, m+1)) + m * sum(range(1, n+1))
...:
...:
...: def quadratic(n, m):
...: total = 0
...: for i in range(1, n+1):
...: for j in range(1, m+1):
...: total += i + j
...: return total
...:
...:
...: @given(st.integers(1, 50), st.integers(1, 50))
...: @settings(max_examples=1000)
...: def test(n, m):
...: assert linear(n, m) == quadratic(n, m)
...:
...:
In [2]: test()
In [3]: %timeit linear(10, 10)
852 ns ± 15.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %timeit quadratic(10, 10)
7.93 µs ± 165 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
由于您是一名初学者,我添加了一个简单的自动属性测试:1)强调测试工作中的天真解决方案与优化的替代方案的重要性,2)演示等效性。还有一些小型n
和m
的基准测试
由于算术级数(即M和N)的和有一个封闭形式的方程,你可以进一步将其归结为一个常数时间O(1)解(我在这里做了一些简化):
附言
如果没有很好的理由,您决不能在全局名称空间中隐藏内置名称(例如,
sum=0
)。请考虑以下几点:
这意味着您天真的二次O(m*n)算法可以用线性O(m+n)解决方案代替:
In [1]: from hypothesis import strategies as st
...: from hypothesis import given, settings
...:
...:
...: def linear(n, m):
...: return n * sum(range(1, m+1)) + m * sum(range(1, n+1))
...:
...:
...: def quadratic(n, m):
...: total = 0
...: for i in range(1, n+1):
...: for j in range(1, m+1):
...: total += i + j
...: return total
...:
...:
...: @given(st.integers(1, 50), st.integers(1, 50))
...: @settings(max_examples=1000)
...: def test(n, m):
...: assert linear(n, m) == quadratic(n, m)
...:
...:
In [2]: test()
In [3]: %timeit linear(10, 10)
852 ns ± 15.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %timeit quadratic(10, 10)
7.93 µs ± 165 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
由于您是一名初学者,我添加了一个简单的自动属性测试:1)强调测试工作中的天真解决方案与优化的替代方案的重要性,2)演示等效性。还有一些小型n
和m
的基准测试
由于算术级数(即M和N)的和有一个封闭形式的方程,你可以进一步将其归结为一个常数时间O(1)解(我在这里做了一些简化):
附言
如果没有很好的理由,您永远不应该在全局名称空间中隐藏内置名称(例如,
sum=0
)。您能给出预期的输入和输出示例吗?我想了解双重求和背后的概念。原始问题在@UtkarshKulshrestha上,您发布的链接与您的代码(即,您的代码不计算您发布的数学表达式)的“双重求和”无关对不起,我已经知道我只是不想要这个问题的答案,因为让别人替我解决竞争性编程问题在道德上是错误的。这就是为什么我修改了问题,但忘记了相应地修改代码。你能给出预期的输入和输出示例吗?我想学习双重求和背后的概念。原始问题在@UtkarshKulshrestha上,您发布的链接与您的代码(即,您的代码不计算您发布的数学表达式)的“双重求和”无关对不起,我已经知道我只是不想要这个问题的答案,因为让别人替我解决竞争性编程问题在道德上是错误的。这就是为什么我更改了问题,但忘了相应地更改代码。我不想得到原始问题的答案,所以我发布了一个不同的方程式,并忘了相应地更新代码。愚蠢的我,我的错误被相应地编辑了。我不想得到原始问题的答案,所以我发布了一个不同的方程式,并忘了更新代码相应地更新我的代码。愚蠢的我,我的错误被相应地编辑了。哎呀,我差点忘了要点。我会记住的。我会记住那个线性解。@UtkarshKulshrestha你应该使用常数时间解。整个过程只是一个例子。哎呀,我差点忘了重点。我会记住的。我会记住那个线性解。@UtkarshKulshrestha你应该使用常数时间解。整个过程只是一个例证。
In [5]: def constant(n, m):
...: return n * m * (2 + m + n) / 2
...:
...:
In [6]: %timeit constant(10, 10)
151 ns ± 1.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)