随机分量算法的时间复杂度(Gillespie算法)

时间:2015-01-12 21:25:07

标签: c++ algorithm random complexity-theory time-complexity

我试图找到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的信息,这是不可能的?

1 个答案:

答案 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)是常数,因为那是......平衡是什么。