【问题标题】:Time complexity of nested loop when inner loop only run once?内循环只运行一次时嵌套循环的时间复杂度?
【发布时间】:2019-12-19 10:15:52
【问题描述】:

我有以下代码并试图找出它的时间复杂度:

int sum(int m, int n, int K) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s += i;
        if (i == K % 2) {
            for (int j = 0; j < m; j++) {
                s += j;
            }
        }
    }
    return s;
}

根据代码,外循环运行时间为 O(n),内循环运行时间为 O(m)。但是,内部循环只执行一次(当i 等于K % 2 时)。我不确定它只运行一次的时间复杂度是 O(nm) 还是 O(n + m)。目前,我怀疑复杂性应该是 O(n + m)。谁能帮我解释一下这个案例?

【问题讨论】:

    标签: time-complexity nested-loops


    【解决方案1】:

    是 O(m + n),因为内部循环只运行一次。

    您通常将内循环的 O(m) 复杂度乘以 n 的原因是因为通常执行内循环 n时间> 次。我们应该将每个操作的复杂性乘以它完成的次数。在这种情况下,O(m) 操作执行了一次,所以你应该乘以 1,而不是 n

    更具体地说,赋值 s += i; 和比较 i == K % 2 总共进行了 n 次,赋值 s += j; 进行了 m 次总计,因此总步数为 O(m + n)。没有执行mn次或mn次的任意倍数的操作。

    【讨论】:

    • 因此,如果嵌套循环具有相同数量的元素,它只是 O(2n) 可以归结为线性时间?
    • @CodyVollrath 我不听你的问题。通常嵌套循环会增加迭代次数,因为内循环每次外循环迭代都会运行一次。这里的区别在于,内循环只运行一次,与外循环的迭代次数无关。
    • 对不起,我没有澄清,我的意思是如果嵌套循环迭代相同数量的元素,并且它只运行一次,它将是 O(2n)。我自己已经确认了这一点,但我在阅读此答案时问过。
    • @CodyVollrath 是的,在这种情况下,出于同样的原因,它会是 O(n)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多