【问题标题】:Time complexity function of a nested loop given the following loop给定以下循环的嵌套循环的时间复杂度函数
【发布时间】:2012-01-28 02:50:07
【问题描述】:
for(i = 1; i <= n; i++)
{
    j = n;
    while(j >= 1)
    {
        // . . . body of the loop needs Θ(1)
        j = j / 2;
    }
}

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    我假设在这个问题中 n 已经被设置在循环之外;并且您的代码将在执行期间保持不变。

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

    让我们看一下外循环。 请注意,i++ 每次将循环递增 1,并且循环上升到 n。 因为循环递增 1,所以它被称为 O(n),因为迭代次数随着 n 的值线性增长。

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

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

    n       # while 循环的迭代次数

    1       1

    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(Log base 2(n)) + 1.

    我们需要使用FLOOR 来模拟整数除法,而+ 1 负责处理我们在j 大于或等于 1 时循环的事实。 p>

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

    总结到目前为止:外循环以 O(n) 的速率增长,而内循环以 O(Log base 2 n) (通常只写为 Log(n)).

    现在,在处理嵌套循环时,总代码的复杂度是通过乘以嵌套循环的复杂度来计算的。这是因为对于外循环的每次迭代,我们都必须完成 Log(n) 内循环。 (请参阅this question 了解更多信息)。

    所以现在你可以看到你提供的 sn-p 的总复杂度是n * Log(n)

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

    【讨论】:

    • 如果thetha的复杂度在循环内发生变化,会影响时间复杂度吗?
    • 我希望您将这两个复杂性加在一起 ​​- 例如。 O(n + log(n))。当然,这意味着循环体的复杂度将只是三角不等式的 O(n)。因此,最终结果将是您将在循环主体中采用最大的复杂性(我认为.. 在这里可以追溯到第一年的 CS)。
    • 如果我将 j 更改为递减循环?它不会改变这里的时间复杂度吗?我必须将递减函数添加到整数除法吗?说如果 j
    • 不太清楚我是否理解,您能否打开一个新问题并发布新的代码示例,以便我明白您的意思。
    • enter code herei=n; enter code herewhile(i>=1){ enter code herej=i; enter code herewhile(jenter code herebody 需要 thetha(1) enter code herej=j*2; enter code here} enter code herei=i/2; enter code here} 我得到的答案是 (logn+1)(logn+2),对吗?
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多