我正在解决一个需要整数列表或大小为10 ^ 18的字典的问题。运行代码后,编译器将引发一条错误消息,指出“已超出内存限制”。
这是我的代码:
def fun(l,r,p):
#f=[None,1,1]
f={0:0,1:1,2:1}
su=0
for i in range(1,r):
if i%2==0:
f[i+2]=2*f[i+1]-f[i]+2
#f.append(2*f[i+1]-f[i]+2)
else:
f[i+2]=3*f[i]
#f.append(3*f[i])
for k in range(l,r):
su=su+f[k]
su=(su+f[r])%p
print(su)
t,p=input().split()
p=int(p)
t=int(t)
#t=3
#p=100000007
for i in range(t):
l,r=input().split()
l=int(l)
r=int(r)
fun(l,r,p)
显示超出内存限制,最大内存使用量为306612KiB
答案 0 :(得分:0)
这里有两个观察结果:
您不需要同时存储所有数字,可以使用双端队列和生成器功能来生成数字,方法是仅跟踪生成的最后三位数而不是整个序列。
import itertools
from collections import deque
def infinite_fun_generator():
seed = [0, 1, 1]
dq = deque(maxlen=2)
dq.extend(seed)
yield from seed
for i in itertools.count(1):
if i % 2 == 0:
dq.append(2 * dq[-1] - dq[-2] + 2)
else:
dq.append(3 * dq[-2])
yield dq[-1]
def fun(l, r, p):
funs = itertools.islice(infinite_fun_generator(), l, r + 1)
summed_funs = itertools.accumulate(funs, lambda a, b: (a + b) % p)
return deque(summed_funs, maxlen=1)[-1]
您可能会有更多的机会在Math.SE中提出此问题,因为我现在不想进行数学计算,但是就像斐波那契数列一样,可能有一个解析解决方案可用于计算第n个分析序列的成员,而不必迭代计算中间数,甚至可以分析得出一个公式,以便在恒定时间内计算总和。