Time complexity 给定以下循环的嵌套循环的时间复杂度函数 (i=1;i=1)的 { //…循环体需要Θ(1) j=j/2; } }

Time complexity 给定以下循环的嵌套循环的时间复杂度函数 (i=1;i=1)的 { //…循环体需要Θ(1) j=j/2; } },time-complexity,Time Complexity,在这个问题中,我假设n已经被设置在循环之外;在执行过程中,代码将保持不变 你的问题有点不清楚,但我的理解是你想知道整个代码的时间复杂性 让我们看看外环。 请注意,i++每次将循环增加1,循环将上升到n。 因为循环增量为1,所以当迭代次数与n的值成线性增长时,它被称为O(n) 接下来,检查内部循环。您可以通过j=n和while(j>=1)行看到循环从n开始,一直到1。假设在while循环中有代码j--。这意味着内循环的迭代次数将随着n线性增加,就像在外循环中一样 然而,循环体是j=j/2(这里假设

在这个问题中,我假设n已经被设置在循环之外;在执行过程中,代码将保持不变

你的问题有点不清楚,但我的理解是你想知道整个代码的时间复杂性

让我们看看外环。 请注意,
i++
每次将循环增加1,循环将上升到
n
。 因为循环增量为1,所以当迭代次数与
n
的值成线性增长时,它被称为O(n)

接下来,检查内部循环。您可以通过
j=n
while(j>=1)
行看到循环从n开始,一直到1。假设在while循环中有代码
j--
。这意味着内循环的迭代次数将随着
n
线性增加,就像在外循环中一样

然而,循环体是
j=j/2
(这里假设整数除法,通过您的注释也假设循环体的其余部分是O(1)-即它是无关紧要的)。 让我们快速查看一下内部循环的
n
的一些示例值:

n
#while循环的迭代

11

2.2

3.2

4.3

5.3

6.3

7 3

8 4

9 4

10 4

11 4

12 4

13 4

14 4

15 4

你可能会看到一个1,两个2,四个3,八个4的模式出现。这些是2的幂。因此,给定
n
的值,我们可以确定迭代次数:

iterations=FLOOR(对数基数2(n))+1

我们需要使用
FLOOR
来模拟整数除法,而
+1
考虑了当
j
大于或等于1时我们循环的事实

因此,迭代次数以n的对数为基数2增长。1在这里不相关,因为我们对大O表示法感兴趣,在大O表示法中,常数倍数或加法对一个函数相对于另一个函数的增长没有影响

到目前为止,总结一下:外循环以O(n)的速度增长,而内循环以O(logbase2n)的速度增长(通常写为Log(n))

现在,在处理嵌套循环时,总代码的复杂性是通过乘以嵌套循环的复杂性来发现的。这是因为对于外部循环的每次迭代,我们必须完成Log(n)个内部循环。(有关更多信息,请参阅)

现在您可以看到,您提供的代码段的总复杂性是
n*Log(n)


如果您想了解更多关于big-O的信息,请参阅。

如果循环中THA的复杂度发生变化,这会影响时间复杂度吗?我希望您将这两种复杂度加在一起-例如O(n+log(n))。当然,这意味着循环体的复杂度仅为三角形不等式的O(n)。所以最终的结果是,你会得到循环体中最大的复杂度(我想……可以追溯到第一年的CS)。如果我把j变成一个递减循环?它不会改变这里的时间复杂性,对吗?我必须把递减函数加到整数除法中吗?如果我不太确定我是否理解,你能提出一个新问题并发布新的代码示例,这样我就能明白你的意思。
在这里输入代码
I=n<代码>在此处输入代码while(i>=1){
在此处输入代码
j=i;
在此处输入代码
while(j
for(i = 1; i <= n; i++)
{
    j = n;
    while(j >= 1)
    {
        // . . . body of the loop needs Θ(1)
        j = j / 2;
    }
}