Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time complexity 时间复杂度与整数输入_Time Complexity_Big O - Fatal编程技术网

Time complexity 时间复杂度与整数输入

Time complexity 时间复杂度与整数输入,time-complexity,big-o,Time Complexity,Big O,我遇到一个问题,要求描述以下代码中大O的计算复杂性: i = 1; while(i < N) { i = i * 2; } 我发现堆栈溢出问题需要答案,投票最多的答案是Log2N 乍一看,答案看起来是正确的,但我记得我学习了psuedo多项式运行时,以及计算复杂性如何根据输入的长度而不是值来衡量难度 因此,对于整数输入,复杂性应该是输入中的位数 因此,这个功能不应该打开吗?因为循环的每次迭代都会将i中的位数增加1,直到达到与N相同的位数。这取决于一个重要的问题:乘法运算是常数吗

我遇到一个问题,要求描述以下代码中大O的计算复杂性:

i = 1;
while(i < N) {
    i = i * 2;
}
我发现堆栈溢出问题需要答案,投票最多的答案是Log2N

乍一看,答案看起来是正确的,但我记得我学习了psuedo多项式运行时,以及计算复杂性如何根据输入的长度而不是值来衡量难度

因此,对于整数输入,复杂性应该是输入中的位数


因此,这个功能不应该打开吗?因为循环的每次迭代都会将i中的位数增加1,直到达到与N相同的位数。

这取决于一个重要的问题:乘法运算是常数吗

在现实世界中,它通常被认为是常量,因为您有固定的32或64位数字,并且将它们相乘总是需要相同=常量时间。 另一方面,如果您使用N<32/64位或任何其他位,则有限制

理论上,当你不考虑乘法为常数运算或某些特殊算法,其中N可以增长太多而忽略乘法复杂度,你是正确的,你必须开始考虑乘法的复杂性。 在这种情况下,乘以常数的复杂性是2——每次都要遍历每一位,并且有log_2N位

在你到达N之前,你必须做2次点击记录

以log_2N*log_2N=Olog_2^2N的复杂性结束

PS:Akash有一个很好的观点,就是乘2可以写成常量运算,因为二进制中唯一需要的是加0,类似于人类可读格式的乘10,只需加0 4333*10=43330


然而,如果乘法不是那么简单,那么您必须遍历所有位,前面的答案是正确的

在给定的示例中,您不是将i的值增加1,而是每次将i的值增加一倍,因此它向N移动的速度是2倍。通过将其乘以2,您将i到N之间的搜索空间大小减少了一半;i、 e,将输入空间减少2倍。因此,程序的复杂性是-log_2n

如果你碰巧-

i = i * 3;

您的程序的复杂性将是log_3 N.

此代码可以在如下函数中找到:

function FindNextPowerOfTwo(N) {
    i = 1;
    while(i < N) {
        i = i * 2;
    }
    return i;
}
这里,输入可以被认为是一个k位无符号整数,我们可以想象它是一个k位字符串。因此,输入大小为k=floorlogN+1位输入

赋值i=1应解释为创建一个新的位字符串,并将其长度赋值为一位字符串1。这是一个恒定的时间操作

循环条件i 在循环内部,我们将i乘以2。此操作的复杂性取决于如何解释乘法。当然,我们可以用这样一种方式来表示我们的位字符串,我们可以通过执行位移位并在末尾插入零来智能地乘以2。这可能是一个恒定时间的操作。如果我们忽略了这个优化,并执行标准的长乘法,我们扫描i的位字符串一次,写出一行0,然后再写一行额外的0,然后通过扫描这两个字符串执行带进位的常规加法。这里每一步所花费的时间与i的位串长度成正比,比如说加1,那么整个过程与i的位串长度成正比。由于i的位字符串长度假定值为1、2、…、k+1,因此总时间为2+3+…+k+2=k+2k+3/2=Ok^2

返回i是一个常数时间操作


综上所述,运行时是由形式为c*k^2的函数从上到下限定的,因此最坏情况复杂度的界是Tak^2=Talgon^2

N的二进制表示的长度是log2N。您不理解这个问题。假设N是难以置信的大,乘以难以置信的大的数字不是常数运算,如果这个数字有四倍的咬合呢?你知道吗,现在的计算机要用几千年的时间才能把它相乘?乘以2是一个恒定的运算,因为你可以通过位的左移来实现它。N很大,我同意,但是
至少我还没有开始。想想数字行中的i和N,在数字行中i接近N的速度更快,因为它在每次迭代中都乘以2。这实际上是一个非常好的答案:。然而,你的asnwer仍然部分不正确,因为与3相乘不能如此容易地完成,你必须检查所有位,对吗?是的,你是对的,在机器级别,与3相乘并不像与2相乘那么简单,但它仍然是一个恒定的时间操作。既然O1+O1是渐近的O1,你能解释一下,对于一个具有四次方或任何其他位数的数字,如何在恒定时间内乘以3吗?