关于时间复杂度计算和实时消费的难题

时间:2017-11-14 08:58:07

标签: javascript algorithm time-complexity

在学习算法的基本知识的同时,我发现了关于时间复杂度计算和运行代码时的实时消耗的难题。

演示代码指定了问题。

function calcDemo1(){
    var init = 0; 
    for(var i=0;i<40;i++){
        init += 0;
    }
    return init;
}

function calcDemo2(){
    var init = 0; 
    init += (0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39);
    return init;
}
  1. calcDemo1的时间复杂度是否为O(1),即使它是&#34; for循环&#34;?
  2. 如果他们的时间复杂度都是O(1),那么在运行代码的最坏情况下他们会花费相同的时间吗?
  3. 相关问题是here

2 个答案:

答案 0 :(得分:3)

它们都具有恒定的时间复杂性。 O(1)时间复杂度。

对于case-1,有一个for循环但它运行了40次。因此,它将具有恒定的时间复杂性。

在第二种情况下,没有for循环,但它仍然是添加时间。所以再次O(1)

它并不意味着如果存在循环,它的复杂性就不会是恒定的

作为回复评论,是的,即使我们增加硬编码值,时间复杂度也不会改变。它仍然是O(1)

答案 1 :(得分:0)

常量时间复杂度O(1)意味着执行需要相同的时间,无论输入多大。

线性时间复杂度O(n)表示执行时间与输入大小增加的程度相同。

您的示例

这取决于您定义的输入。在下面的分析中,我假设您的输入是循环/添加数字的次数(40)。如果根本没有输入,则任何代码将具有恒定的时间复杂度O(1)

calcDemo1 很可能具有线性复杂性,因为javascript编译器不够聪明,无法弄清楚它可能只是跳过循环。它实际上会增加i 40次,然后将0添加到init 40次(或者至少检查它是否实际上必须添加任何内容)。因此,循环的每次旋转实际上需要一些时间,例如,循环4000次将比40次长100倍。

calcDemo2 也具有线性复杂度O(n):添加100万个数字的时间大约是添加1000个数字的1000倍。