Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
Loops 为什么此循环返回的值为';s O(n日志n)而不是O(n日志n)?_Loops_For Loop_Time Complexity_Nested Loops_Asymptotic Complexity - Fatal编程技术网

Loops 为什么此循环返回的值为';s O(n日志n)而不是O(n日志n)?

Loops 为什么此循环返回的值为';s O(n日志n)而不是O(n日志n)?,loops,for-loop,time-complexity,nested-loops,asymptotic-complexity,Loops,For Loop,Time Complexity,Nested Loops,Asymptotic Complexity,考虑以下C函数: int fun1 (int n) { int i, j, k, p, q = 0; for (i = 1; i<n; ++i) { p = 0; for (j=n; j>1; j=j/2) ++p; for (k=1; k<p; k=k*2) ++q; } return q; } 但是,如果循环变量除以/乘以常量,则循

考虑以下C函数:

int fun1 (int n)
{
    int i, j, k, p, q = 0;

    for (i = 1; i<n; ++i)
    {
        p = 0;

        for (j=n; j>1; j=j/2)
            ++p;

        for (k=1; k<p; k=k*2)
            ++q;
    }
    return q;
}
但是,如果循环变量除以/乘以常量,则循环的时间复杂度被视为O(Logn)

for (int i = 1; i <=n; i *= c) {
    // some O(1) expressions
}

for (int i = n; i > 0; i /= c) {
    // some O(1) expressions
}
for(inti=1;i0;i/=c){
//一些O(1)表达式
}

但是有人提到,内部循环每次都要花费Θ(logn)时间,有人能解释一下ar是错误答案的原因吗?

这个问题很棘手-代码的运行时间和返回值之间存在差异

第一个循环的运行时实际上是O(logn),而不是O(logn)。我在这里重印了它:

p = 0;
for (j=n; j > 1; j=j/2)
  ++p;
在每次迭代中,j的值下降两倍。这意味着该循环终止所需的步数由最小值k给出,使得n/2k≤ 1.通过求解,我们看到k=O(log2n)

请注意,此循环的每次迭代都会将p的值增加1。这意味着在循环结束时,p的值为Θ(logn)。因此,下一个循环确实在时间O(log n)内运行:

对于(k=1;k 原因是,使用与上一节类似的推理,此循环的运行时为Θ(logp),并且由于p=Θ(logn),因此最终为Θ(logn)

但是,问题不是询问运行时是什么。它询问返回值是什么。在每次迭代中,q的值(最终返回的值)增加Θ(loglogn),因为在时间Θ(loglogn)内运行的循环每次迭代都会增加一次。这意味着q的净值为Θ(n log n)。因此,尽管算法在时间O(n log n)中运行,但它返回的值为O(n log n)

希望这有帮助

答案是(D)O(n*log(logn))。原因如下:-

第一个for循环包含另外两个for循环,分别基于j和k的值。同时,j从n减半,直到大于1。因此,p将等于最大整数(logn)。k加倍直到等于p,其中p是从上一个循环中设置的,等于[logn],其中[x]等于x的最大整数

因此,第三个循环将运行log(logn)时间,因此q的值将是
log(logn)
。因此,两个内部循环都是运行n次的外部for循环的一部分


q=n*log(log n))=O(n log(log n))的近似值。

我在这里看到的唯一错误与第二个循环有关: 对于(j=n;j>1;j=j/2) 你在评论中说:这个循环运行Θ(logn)次

在我看来,这个循环运行O(logn)次

第一个和第三个循环的运行时间正确(O(n)和O(logn))


编辑:我同意前面的答案。我没有注意到问题是关于返回值,而不是运行时间

仔细阅读这个问题——它询问的是返回值是什么,而不是运行时。我第一次犯了同样的错误。@templatetypedef补充了答案,但是,可能我太晚了(这是为了帮助我:)@coder101哦,我以为templatetypedef投了赞成票。无论如何,谢谢哥们,你能不能也检查一下这个问题:)@coder101就我所知,时间复杂度为O(n log n)的说法是不正确的。注意,这个问题并不是问函数返回需要多长时间,而是问你能对返回值(q)说些什么。是的,这很有帮助,他们的答案是正确的,但解释是错误的:)你能不能也检查这个问题:)你能不能也检查这个问题:)
p = 0;
for (j=n; j > 1; j=j/2)
  ++p;