在学习算法的基本知识的同时,我发现了关于时间复杂度计算和运行代码时的实时消耗的难题。
演示代码指定了问题。
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;
}
相关问题是here
答案 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倍。