【问题标题】:Problem with calculating time complexity for given piece of code计算给定代码的时间复杂度的问题
【发布时间】:2019-11-19 20:02:46
【问题描述】:

我无法计算这段代码的时间复杂度。

int count = 0;
for(int i = 0; i < n; i++)
    for(int j = 0; j < i; j++)
        count ++;

我知道外循环将执行n 次,但我不知道内循环将执行多少次。 谁能告诉我答案以及如何解决这个问题?

【问题讨论】:

    标签: algorithm big-o


    【解决方案1】:

    内部循环执行i 次。 i 的值将是 0,然后是 1,然后是 2,然后是 3...直到外循环的最后一次迭代中的 n - 1

    所以内循环的总迭代次数将是 1 + 2 + ... + (n-1) = n(n - 1)/2,即 O(n²)。

    一种更非正式的推导方式是,平均而言,i 约为 n/2,因此内部循环迭代 O(n) 次(但不完全是 n 次)。所以总迭代次数是 n(来自外循环)乘以 O(n),得到 O(n²)。

    【讨论】:

    • 你是从哪里得到除以 2 的?我不明白它是从哪里来的。
    • 公式 n(n-1)/2 只是从 1 到 n-1 的数字之和的标准公式。 i 平均约为 n/2 的说法只是给出了其最低值 (0) 和最高值 (n-1) 之间的近似中点,因为它在它们之间呈线性变化。
    【解决方案2】:

    你可以在纸上画一个小草图。外循环是行数,列数是内循环中count++ 操作的数量。
    结果将是一个三角形。即 n² / 2 即 O(n²)

    示例 n=5:

    i=0:   
    i=1:   x
    i=2:   xx
    i=3:   xxx
    i=4:   xxxx 
    

    【讨论】:

      【解决方案3】:

      (我们可以忽略循环条件检查和计数器增量的执行时间)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-19
        • 2022-01-19
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多