第n个Fibonacci线性算法的异常值

时间:2017-09-13 13:43:50

标签: performance fibonacci

所以我被教导使用Fibonacci数的递归关系,我可以得到一个O(n)算法。但是,由于大n的斐波纳契数的大尺寸,加法成比例地增加:意味着,时间复杂度不再是线性的。

这一切都很好但是在这个图(source)中,为什么有一个接近1800000的数字,其计算时间要比它的邻居长得多?

编辑:如答案所述,异常值约为180000,而非1800000

enter image description here

2 个答案:

答案 0 :(得分:1)

异常值发生在180,000,而不是1,800,000。我不知道python中存储了多大整数,但假设32位字存储为二进制,则fib(180000)接近100,000字节。我怀疑测试的问题是为什么180,000会花费超过181,000或179,000。

@cdlane提到了fib(170000)到fib(200000)所需的时间,但增量为1000,因此这将是30个测试用例,每次运行10次,这将花费不到20分钟。

链接的文章提到了用于计算Fibonacci数的矩阵变量,这是一个log2(n)过程。这可以使用类似逻辑的Lucas序列进一步优化(重复平方以将矩阵提升到幂)。 64位无符号整数的示例C代码:

uint64_t fibl(uint64_t n) {
    uint64_t a, b, p, q, qq, aq;
    a = q = 1;
    b = p = 0;
    while(1) {
        if(n & 1) {
            aq = a*q;
            a = b*q + aq + a*p;
            b = b*p + aq;
        }
        n >>= 1;
        if(n == 0)
            break;
        qq = q*q;
        q = 2*p*q + qq;
        p = p*p + qq;
    }
    return b;
}

答案 1 :(得分:0)

  

可能时间的测量是在其他系统上进行的   任务同时进行,这导致一个单一的   计算时间比预期的要长。

OP没有复制的部分图表说:

  

注意:每个数据点的平均值超过10次计算[原文如此]。

所以这似乎否定了这个解释,除非它是 巨大的 差异,我们只是看到它在正常时间平均。

(我的2012年老式Mac mini使用作者的代码计算出每秒1/2秒的第200,000个数字。生成此数据的机器花了4秒多的时间来计算第200,000个数字。我拿出一个2009年老式MacBook确认这是可信的。)

我使用修改后的代码版本创建了我自己的粗略图表,每次都没有重新启动,但保留了总计的时间并得出以下图表:

enter image description here

由于我使用的算法在每次计算中增加了一些打印开销,因此时间比预期的要长一些。但是没有180,000到195,000之间的大异常。