Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/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_Time Complexity_Big O - Fatal编程技术网

Algorithm 如何计算此代码的时间复杂度?

Algorithm 如何计算此代码的时间复杂度?,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,如何计算以下算法的时间复杂度 int x =0; for (int i = 1; i < n; i++) { for (int j = 1; j < n; ++j) { x++; n--; } } intx=0; 对于(int i=1;i1 考虑以下代码(上限): intx=0; 对于(;n>1;){ 对于(int j=1;j总的来说,复杂性是O(n) 我认为上限-下限方法的关键

如何计算以下算法的时间复杂度

int x =0;

      for (int i = 1; i < n; i++) {

        for (int j = 1; j < n; ++j) {
            x++;
            n--;
        }
    }
intx=0;
对于(int i=1;i
我知道嵌套for循环的时间复杂度等于最内层循环的执行次数

就像外部循环从1到n的每个嵌套循环一样,它应该运行n次,但是这里我们有
n--
,这使得算法运行的顺序更好。实际上,我在IDE中编写了这段代码,在循环结束后,我打印了x的最终结果,结果是不同的n值,我看到我们跳转到内部for循环需要将近n次的时间

所以我认为这个算法的整体顺序是O(n)
,但我不确定

谁能帮我彻底证明一下吗?

你说得对

n
减少的总次数不能超过其原始值(
i
j
从不为负值)

因为对于内部循环的每个迭代,
n
正好减少一次,这就为您提供了运行次数的上限,使您的代码
O(n)


您还可以看到,这是一个严格的界限,因为第一次运行内部循环时,当
i>=n
时,它将停止,这将在
~n/2
迭代后发生,同时给出
ω(n)
的下限。

如果您只希望时间复杂度为大O或大θ,让我们来计算上界和下界,这两种情况比较简单

考虑到
内部for循环
n
将在此时减少一半,或者
n
将在每次退出
内部for循环时变为
n/2
(您已经知道了,对,因为
j
一次增加1个单位,
n
一次减少1个单位,所以
j
n
将在
中间的n
n/2
处相遇)当我们不知道代码何时停止时,事情就变得复杂了,
n=?
,但我们知道
n>1

考虑以下代码(上限):

intx=0;
对于(;n>1;){
对于(int j=1;j
n
每次迭代将变为
n/2
,直到
n=1
,因此obove代码的复杂性将为
n/2+n/4+n/8+…+1=O(n)

下限更容易,假设
内部for循环
只运行1次迭代,代码完成,1次迭代给我们提供了
n/2
运算符。因此下限是
O(n)

=>总的来说,复杂性是
O(n)


我认为
上限-下限方法的关键是在代码中省略一些
复杂-难以计算-不清楚的变化变量
,并将其与原始变量进行比较

为什么不简单地用不同的大小对其进行分析?如果你是对的,这将给你一个很好的指标。当你确定后,开始尝试证明它。
int x =0;

      for (;n > 1;) {

        for (int j = 1; j < n; ++j) {
            x++;
            n--;
        }
    }