【问题标题】:Big-O & Big-Theta: is a for loop O(1) time complexity?Big-O 和 Big-Theta:是 for 循环 O(1) 时间复杂度吗?
【发布时间】:2016-02-16 06:58:11
【问题描述】:

我很难理解 Big-O 和 Big-Theta 的确切含义。有人可以解释一下这是什么意思吗?

鉴于 n 是一个常数,最坏情况下的 for 循环是否为 O(1) 时间复杂度?

此外,由于 insertSort 的复杂度为 O(n^2),算法的最坏情况运行时间是否低于 O(n^2)?如果不是,以下算法在最坏情况下的时间复杂度是多少?

void fnA(int[] array)
{
   ArrayList a2 = new ArrayList<Integer>(array.length);

   for (int i=0; i<n; i++) {
      a2.add(array[i]);
      insertionSort(a2);
   }
}

【问题讨论】:

    标签: for-loop big-o time-complexity big-theta


    【解决方案1】:

    您可以将 Big-O 视为上限。 如果你有一个 for 循环。说

    for i:= 1 to 10 print("hello");
    

    那么它的复杂度是 O(1)。 O(1) 并不意味着它在 1 条指令中完成。它只是意味着它在运行时间方面不会随输入大小(即 n)而变化。同样,O(n) 表示其运行时间与输入大小成正比。

    对于您的示例,您可以通过以下方式使其变得简单:您有一个复杂度为 O(n) 的外部 for 循环。然后在循环体中,调用 add(即 O(1))和 insertSort,即 O(n^2)。那么总复杂度是O(n) * (max(O(1), O(n^2)) = O(n^3)。

    实际上,这只是估算复杂性的快速方法。对于更准确的方法,您应该做一些数学运算,例如当 a2 的长度为 1、2、3....、n 时,插入排序中需要执行多少条指令。然后总结它们。它会给你一些公式,其中最重要的项是 n^3。

    【讨论】:

    • 那么函数中的for循环是O(1)还是O(n)?因为 O(n) * O(n^2) = O(n^3)?
    • 那么 Big-Theta 的运行时间是多少?
    • @CarolineRudolph:For 循环是 O(n),因为它以 n 作为参数,所以它的运行时间与 n 成正比。在这种情况下。 Big-Thea 也是 O(n^3)。
    • 谢谢!那么 O(n) 是 Theta(n) 的上限吗?
    • Big-Theta 是紧束缚的,意味着它可以准确估计程序的运行时间。 Big-O 是上限,它为您提供上限。在我看来,人们经常使用 Big-O 的原因是有时很难获得确切的 Big-Theta,因此您只需获得上限,以便在最坏的情况下获得一些想法。对于一个程序,Big-O 等于或大于 Big-Theta。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多