Javascript 关于时间复杂度计算和实时消耗的一个难题

Javascript 关于时间复杂度计算和实时消耗的一个难题,javascript,algorithm,time-complexity,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

在学习算法的基础知识的同时,我发现了运行代码时的时间复杂度计算和实时消耗的困惑

演示代码指定了问题所在

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;
}
函数calcDemo1(){
var init=0;

对于(var i=0;i它们都具有恒定的时间复杂度。
O(1)
时间复杂度

对于案例1,有一个For循环,但它运行了40次。因此它的时间复杂度是恒定的

在第二种情况下,没有for循环,但它仍然是连续的时间加法,所以它又是
O(1)

这并不意味着如果有for循环,它的复杂性就不能是常数


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

对于案例1,有一个For循环,但它运行了40次。因此它的时间复杂度是恒定的

在第二种情况下,没有for循环,但它仍然是连续的时间加法,所以它又是
O(1)

这并不意味着如果有for循环,它的复杂性就不能是常数


作为对评论的回复,是的,即使我们增加硬编码的值,那么时间复杂度也不会改变。它仍然是
O(1)
常量时间复杂度
O(1)
意味着无论输入有多大,执行都需要相同的时间

线性时间复杂度
O(n)
意味着执行所需时间更长,与输入大小增加的程度相同

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

calcDemo1最有可能具有线性复杂性,因为javascript编译器不够聪明,无法判断它是否可以跳过循环。它将实际增加
i
40倍,然后将
0
添加到init 40倍(或者至少检查它是否确实需要添加任何内容)因此,每次循环实际上需要一些时间,比如说,循环4000次比40次长100倍


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

常数时间复杂度
O(1)
意味着无论输入有多大,执行所需的时间都是相同的

线性时间复杂度
O(n)
意味着执行所需时间更长,与输入大小增加的程度相同

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

calcDemo1最有可能具有线性复杂性,因为javascript编译器不够聪明,无法判断它是否可以跳过循环。它将实际增加
i
40倍,然后将
0
添加到init 40倍(或者至少检查它是否确实需要添加任何内容)因此,每次循环实际上需要一些时间,比如说,循环4000次比40次长100倍


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

复杂度始终与某个算法有关。现在,如果数字40硬编码到算法中,那么,是的,它将是恒定的时间复杂度,因为输入没有变化。不过,我很确定OP希望这样做了解不同输入的时间复杂度(比如1000而不是40)@E.Villiger.:我回答。如果硬编码的值是常数,那么时间复杂度是常数,你是对的。但是,通常对于这些类型的问题,它想知道算法对于不同的输入大小是如何执行的。@E.Villiger.:如果循环依赖于输入大小,那么在[1,n]范围内的for循环将产生O(n)时间复杂度假设我们在循环中所做的事情在时间上是恒定的。复杂度总是与某个算法有关。现在,如果数字40被硬编码到算法中,那么,是的,它将是恒定的时间复杂度,因为输入没有变化。不过,我很确定,OP想知道varyi的时间复杂度ng输入(比如1000而不是40)@E.Villiger.:我回答。如果硬编码的值是常数,那么时间复杂度是常数,你是对的。但是,通常对于这些类型的问题,它想知道算法对于不同的输入大小是如何执行的。@E.Villiger.:如果循环依赖于输入大小,那么在[1,n]范围内的for循环将产生O(n)考虑到我们在循环中所做的事情在时间上是恒定的,因此时间复杂性。问题的第二部分是不可能回答的。最有可能的情况是,这两个代码段将花费不同的时间。见鬼,如果您甚至重新运行同一个函数,它很可能会花费不同的时间,因为您的javascript引擎、浏览器、,操作系统,…还必须以伪并发的方式解决不同的问题。如果您需要知道在这个宇宙中的特定时刻,它在您的特定计算机上花费了多少,请随意运行它,但不要期望它是可复制的。您问题的第二部分是不可能回答的。最有可能的是,两个代码段将花费不同的时间。见鬼,如果你甚至重新运行同一个函数,它很可能会