【问题标题】:Best & Worst Case Algorithm Complexity最佳和最坏情况算法复杂度
【发布时间】:2021-03-28 13:31:01
【问题描述】:

我很难找到以下算法的复杂性:

int count = 0;
for (int i = 0, i <n -1; i++) {
   for (int j = i +1; j < n; j++) {
      for (int k = n; k > n/2; k--) {
          count++;
      }
   }
}

int j = 0;
int num = count;
while(j < num) {
    for (int k = 0; k < 10; k++) {
        count++;
    }
    j++;
}

在最坏的情况下,我得到了 O(????)。这是对的还是我搞砸了?

如果有人可以解释,那就太好了,也许每行正在发生什么操作。我在第一部分真的很困惑,因为有多个嵌套的 for 循环。

【问题讨论】:

  • 你是如何得到 O(n^3) 的?正如数学老师所说,你能展示你的工作吗?
  • 可能是因为缺乏正确的理解,但这是因为第一个块中的三个for循环,但我不太确定特别是“for (int k = n; k > n/2; k--)",因为这看起来像 log(n),对还是我又错了?

标签: algorithm time-complexity


【解决方案1】:

确实是 O(?³)。

外部的两个循环提供了从具有 ? 值的集合中选择两个不同值(?,?)的所有可能方法。这是triangular number,因此是 O(?²)。

内部循环会进行 ?/2 次迭代,即 O(?/2) = O(?),所以第一个代码块代表 O(?³)。

代码的第二部分有一个while 循环,它进行count 迭代,我们知道这个计数是O(?³)。它的内部循环迭代 constant 次,因此表示一个恒定的时间复杂度:O(C?³) = O(?³)

所以我们总共有 O(?³)+O(?³) = O(?³)。

由于除了?之外没有变量输入,也没有任何随机性,迭代次数完全由它决定,因此没有最好或最差的概念。只有固定的时间复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多