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
Algorithm 大哦_Algorithm_Loops_Big O - Fatal编程技术网

Algorithm 大哦

Algorithm 大哦,algorithm,loops,big-o,Algorithm,Loops,Big O,我遇到了一些大问题的挑战。这些不是家庭作业问题。我写这些问题是为了更好地理解这里的概念 function func(n) { int k,i = 0; while(k < n){ < --- Guessing this outer loop is O(n/2) k = n + 2 i = 0; while(i < k){ <--- Not sure what this is? i

我遇到了一些大问题的挑战。这些不是家庭作业问题。我写这些问题是为了更好地理解这里的概念

function func(n)
{
     int k,i = 0;
     while(k < n){ < --- Guessing this outer loop is O(n/2)
        k = n + 2
        i = 0;
        while(i < k){ <--- Not sure what this is?
            i ++;
            i = i * i;
         }
      }         
}
函数func(n) { int k,i=0; 而(k而(ii的值平方,直到它达到
k
。如果忽略常数项,这个循环在
O(logk)
时间内运行

为什么?因为如果你求解
i^m=k
你会得到
m=constant*log(k)

正如您所说,外部循环在
O(n)
时间内运行


由于
k
的较大值取决于
n
,您可以说内环在
O(logn)
中运行,这使您的总体复杂度为
O(nlogn)
外环及其测试
(k
及其步骤
k=n+2
将运行一次,提供了一个O(1)复杂度因子

内环有test
(i
,也就是说
(i
,并且在末尾有步骤
i++;i=i*i;

i = (...(((1+1)^2+1)^2+1)^2+ ... )^2 > n+2` 

这使得
i
的值呈超指数增长。也就是说,
i
在p个过程中的增长速度比exp(exp(p))快,因此总体复杂度小于O(logn)。这是一个比前面提到的O(logn)更严格的界限,这也是一个上限,但没有那么严格。

虽然@alestanis对这个问题的分析在我看来比评论中的分析要准确得多,但我仍然认为这是不对的

让我们创建一个小测试程序,打印出内部循环生成的
i
的值:

#include <iostream>

void inner(double k) {
    double i;

    i = 0.0;
    while(i < k) {
        i ++;
        i = i * i;
        std::cout << i << "\n";
     }
}

int main() {
    inner(1e200);
    return 0;
}
如果迭代次数是对数的,则达到某个特定数字的迭代次数应与限制中的位数成比例。例如,如果是对数的,则需要大约180次迭代才能达到1e181,给定或获取一些(相当小)常数因子。这里的情况显然不是这样——通过观察科学记数法中结果的指数很容易看出,这大约是每次迭代位数的两倍,而对数意味着每次迭代大约增加一位数

我不是绝对确定,但我相信这会将内部循环设置为类似O(loglogn)的位置,而不是仅仅设置为O(logn)。我认为很容易同意外部循环可能设置为O(N)(尽管它目前被编写为只执行一次),将整体复杂度设置为
O(nlogn)

我觉得有必要从实用的角度补充一下,
O(logn)
通常可以被视为基本常量——如上图所示,您可以使用典型的双精度浮点数指定的最高限制仅在11次迭代中达到。因此,对于大多数实际目的,总体复杂性可以被视为
O(N)


[哎呀--我写这篇文章的时候没有注意到他已经回答了,但是看起来@jwpat7已经得出了与我差不多的结论。他/她真是太好了。]

应该
k=n+2
不是:
k=k+2
或者类似的东西吗?现在你的外循环没有重复多次。我猜时间复杂度仍然是O(nm).内环是O(m),外环,就像你提到的,是O(n/2)。总结起来是O(nm)/2。2是一个常数,随着输入的增加,它将与比率无关。我正在学习自己。所以,我可能错了。你可能对关于和拉斐尔评论中相关的问题感兴趣。我同意内环的复杂性是O我不知道它是否是θ,因为(…((1+1)^2+1)^2+1)^2+…)^2的增长速度明显快于p的exp(exp(p/2))passes@jwpat7:是的,我想尝试更彻底地分析它,但结果是大量的迭代非常接近常量,以至于我很难真正关心。。。
1
4
25
676
458329
2.10066e+011
4.41279e+022
1.94727e+045
3.79186e+090
1.43782e+181
1.#INF