我试图找到Gillespie算法的时间复杂度。
可以找到常规算法:Here
更多扩展版本:Here
假设反应的数量和蛋白质的数量是不变的。这可能允许我仅通过时间变量来计算时间复杂度。
但是我被卡住了,因为每次迭代的时间增加都是基于一个随机值。让我详细说明(删除不相关的代码):
所以这是一般循环,每次迭代都会更新反应,然后更新currentTime。
currentTime = 0.0;
while(currentTime < timeEnd)
{
reactions->calcHazard();
currentTime += this->getNextTime();
}
函数getNextTime计算新时间。
double Gillespie::getNextTime()
{
double randVal;
randVal = ((double) rand() / (double)(RAND_MAX));
while ( randVal == 0)
{
randVal = ((double) rand() / (double)(RAND_MAX));
}
return ((1.0/reactions->getSum())*(log(1.0/randVal)));
}
新时间大小的计算基于随机值R.此处的其他变量分量是反应的结果 - > getsum。该函数的返回值为
sum(k*A(t))
当k和A(t)都是载体时,k是每个反应的概率,A(t)是时间t的蛋白质数。
上一个链接的第7页可能会提供有关时间增加的更好解释。
是否可以说出这个时间复杂度(从tStart迭代 - > tEnd)?或者,如果没有关于#proteins和#reactions的信息,这是不可能的?
答案 0 :(得分:0)
它是O(n)
。您并不需要计算getNextTime()
的预期回报值。足以知道它的返回不会因模拟运行而发生变化。
假设您的代码为N
模拟循环1 hour
次循环。
很明显,这些是等价的......
timeEnd = currentTime + 2hours;
while (currentTime < timeEnd) { ... } // ??? iterations
相当于
timeMid = currentTime + 1hour;
timeEnd = currentTime + 1hour;
while (currentTime < timeMid) { ... } // N iterations
while (currentTime < timeEnd) { ... } // <=N iterations
因此,它会为2N
模拟迭代约2 hour
次循环。
假设反应的数量和蛋白质的数量是恒定的
这是有用的假设。基本上,这意味着getNextTime()
在模拟运行时不会系统地增加或减少。如果getNextTime()
的返回值在模拟过程中减少(意味着A(t)在模拟过程中增加),那么第二个循环将比第一个循环花费更多的迭代。
如果系统在某个时刻达到平衡,你可能会做出这样的假设(这是不可避免的吗?我不是化学家)。因为那时A(t)是常数,因为那是......平衡是什么。