【问题标题】:Big O notation calculation for nested loop嵌套循环的大 O 表示法计算
【发布时间】:2022-07-18 15:48:50
【问题描述】:
for ( int i = 1; i < n*n*n; i *= n ) {
    for ( int j = 0; j < n; j += 2 ) { 
        for ( int k = 1; k < n; k *= 3 ) { 
            cout<<k*n;
        }
    }
}

我在这个练习中遇到了一个问题,我需要找到以下代码的大 O 表示法,但我得到了 O(n^5),其中第一个循环是 n^3,第二个循环是 n,并且第三个循环是 n,我不确定我是否正确。有人可以帮帮我吗?

【问题讨论】:

    标签: c++ algorithm time big-o


    【解决方案1】:

    第一个循环是 i=1 并且每次乘以 n 直到它的 n^3 所以它的 3 次,即 O(1)。
    第二个循环是 j=1 并且每次加 2 直到它的 n 所以它的 n/2 次,即 O(n)。
    第三个循环是 k=1 并乘以 3 直到它的 n,即 O(log(n))
    总体:O(n*log(n))

    【讨论】:

      【解决方案2】:

      您的分析正确。

      外层循环每次迭代将 i 乘以 n,从 1 到 n^3。
      因此将有 3 次迭代,即 O(1)

      中间循环每次迭代将 j 递增 2,从 0 到 n。
      因此会有 n/2 次迭代,即 O(n)

      内部循环将 k 乘以 3,从 1 到 n。
      因此会有 log3(n) 次迭代,即 O(log(n))
      如果这一步不清楚,请看这里:Big O confusion: log2(N) vs log3(N)

      代码的整体时间复杂度是上面所有 3 个表达式的乘积(因为这些是嵌套循环)。

      所以是: O(1) * O(n) * O(log(n)),即:O(n*log(n)) .

      【讨论】:

        【解决方案3】:

        你说得不对。在第一个循环 for ( int i = 1; i &lt; n*n*n; i *= n ) 中注意“语句 3”(i *= n),在第三个循环中 for ( int k = 1; k &lt; n; k *= 3 ) 也注意“语句 3”(k *= 3)。您对第二个循环的计算很棒。

        【讨论】:

        • 是log n和log n吗?刚刚发现什么是 *= += -= xD
        • 第二个循环将迭代 n/2 次,在大 O 表示法中,它将是 O(n)。第一个循环将迭代 3 次,即 O(1),第三个循环将迭代 log3(n) 次,即 O(log3(n))。所以总时间复杂度是 O(1)*O(n)*O(log3(n)) 也就是 O(n*log3(n))。
        • @Q_i99i 如果您甚至不知道代码的作用,那么您为什么要尝试分析其复杂性?那是行不通的。首先学习该语言的基础知识。
        • 这是一个复杂的练习
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多