这是我在练习中遇到的一个问题。
细菌有两种。说x和y。在改变类型时,它们每秒繁殖一次。
类型x变为2 y类型和1 x类型(x -> 2y + x
)。类型y变为3 x类型和1 y类型(y -> 3x + y
)。除此之外,还会自发地产生1 x类型和3 y类型(每秒-> x + 3y
)。
任务是计算给定时间t
之后的细菌数。
我在这里写了一个代码:
x = 1
y = 1
t = 2
def calcFinalBacteria (x, y, t):
for i in xrange (t):
tempX = x + y * 3 # contribution by x bacteria (1) and y bacteria (3)
tempY = x * 2 + y # contribution by x bacteria (2) and y bacteria (1)
x += tempX + 1 - x # spontaneous addition of 1 x bacteria
y += tempY + 3 - y # spontaneous addition of 3 y bacteria
print x, y
calcFinalBacteria (x, y)
我的代码的时间复杂度为O(t)。但是有什么改进的方法吗?对于少量输入,也可以。但是当我将t推到10 ^ 18并将x,y推到1000时,要花很多时间才能找到
答案 0 :(得分:2)
因此,如果我理解此权利,请x' = x+3y+1
和y' = 2x+y+3
。假设您的初始种群为十个x和七个y,并且您想一步一步地发展它。可以使用以下矩阵乘法来建模:
|1 3 1| |10|
|3 1 3| x | 7|
|0 0 1| | 1|
因此,要找到答案,您需要重复矩阵乘法t
次。
尽管,按照您编写代码的方式,每个x变成2y和0 x,而不是2y和一个x。
答案 1 :(得分:1)
一个小改进。
您正在向其自身添加值,并减去其原始值。
x = 1
y = 1
t = 2
def calcFinalBacteria (x, y, t):
for i in xrange (t):
tempX = x + y * 3 # contribution by x bacteria (1) and y bacteria (3)
tempY = x * 2 + y # contribution by x bacteria (2) and y bacteria (1)
x = tempX + 1 # spontaneous addition of 1 x bacteria
y = tempY + 3 # spontaneous addition of 3 y bacteria
print x, y
calcFinalBacteria (x, y)