【问题标题】:What is the time complexity of these loops 1 and 2这些循环 1 和 2 的时间复杂度是多少
【发布时间】:2015-12-08 18:12:19
【问题描述】:

我在一个非常受欢迎的网站上浏览了一篇关于循环时间复杂度分析的文章(下面给出了链接),根据那篇文章,下面第一个和第二个循环的时间复杂度是 O(1) 和 O(n)分别。 但我认为两个循环的时间复杂度是相同的 O(n)

for (int i = 1; i <= c; i++) {  
    // some O(1) expressions
}

我的推理:`c*n=O(n)

在看完下面的答案后,我的推理是错误的,因为没有变化的输入 n。循环运行是固定的 - c 次。因此,无论输入值 n 是什么,循环都将运行恒定时间。所以 O(1) 复杂度

for (int i = 1; i <= n; i += c) {  
    // some O(1) expressions
}

我的推理:c*n=O(n)

我是否遗漏了什么?如果有人可以提供帮助和解释,我将不胜感激

这是文章的链接:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/

【问题讨论】:

    标签: algorithm time-complexity


    【解决方案1】:

    运行恒定次数的循环或递归也是 被认为是 O(1)。

    这里:C 是一个常数值。所以基本上,无论n 的值如何,您都在执行恒定数量的操作

       // Here c is a constant   
       for (int i = 1; i <= c; i++) {  
            // some O(1) expressions
       }
    

    也在第二个循环中:

    for (int i = 1; i <= n; i += c) {  
        // some O(1) expressions
    }
    

    你的理由c*n = O(n)不正确。这里 以C 递增。对于n 元素,循环出现n/c,这是渐近的O(n/c) ~ O(n)

    【讨论】:

    • 整个循环就像一个常数,因为它不依赖于变化的输入值——循环是固定的吗?对
    • 非常感谢 Sakib 的两个案例。我现在明白了
    【解决方案2】:

    for (int i = 1; i

    这里c 是一个常数。所以基本上,无论n 的值如何,您都在执行恒定数量的操作。这就是为什么它被认为是恒定的复杂性,O(1)

    for (int i = 1; i

    您正在使用输入值n 进行循环,该输入值本质上是随程序或算法的给定输入而变化的。现在c 又是一个常数,对于n 的所有不同值都将保持不变。复杂度被认为是O(n)

    for (int i = 1; i

    这和上面的一样,只是c的值是1

    所有复杂性都以渐近符号格式表示。 常数因子被移除,因为无论n 的值如何,它们都是相同的。

    【讨论】:

    • 他换了题,再过一遍。
    • 好的,让我们在两个循环中使用一个简单的打印语句 -SOP("hello World")- ,现在不是打印多少次取决于输入的值:n ?overall ,应该时间复杂度不是打印单个时间乘以输入所花费的恒定时间吗?
    • 请立即查看答案。
    • c 只是一个常数值。第一种情况是c,后来是1
    【解决方案3】:

    1) 图片中没有n,我不知道你为什么认为是O(n)loop 来自1 to c,所以它的O(c),因为c 是一个常数,所以复杂度是O(1)

    2) 循环从1 开始,一直到n,每一步递增c。显然,复杂度是O(n/c),渐近地是O(n)

    【讨论】:

    • @Harish:所以两个循环都有 O(n) 复杂度?对:在这两种情况下,循环内的常量被打印多少次(-认为这是循环中的常量表达式)取决于输入的值:n
    • @Naruto_Uzumaki BTW,在链接中,c 仅适用于第一个循环。
    • 你是对的。我刚刚注意到在 link 中,它是 c 而不是 n inist loop 。
    • @Naruto_Uzumaki 这就是为什么我改变了答案。最初我发布了1st 循环是恒定的。
    • "it's c not n" 使第一个循环保持不变,不是吗? oO
    【解决方案4】:

    O(1) : 这个循环的复杂度是 O(1),因为它运行的时间是恒定的 c。

    // Here c is a constant   
       for (int i = 1; i <= c; i++) {  
            // some O(1) expressions
       }
    

    O(n):循环的复杂度是O(n),如果它以恒定的量递增或递减。例如,这些循环的时间复杂度为 O(n)。

    // Here c is a positive integer constant   
       for (int i = 1; i <= n; i += c) {  
            // some O(1) expressions
       }
    
       for (int i = n; i > 0; i -= c) {
            // some O(1) expressions
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多