繁体   English   中英

大O符号(复杂度)

[英]Big O notation (Complexity)

这个循环的最大作用是什么? ->我知道循环本身将执行n次。 但是循环中的任务也会执行n次,对吗? 那么,这将使它成为O(n ^ 2)还是我不将它们与其简单的O(n)结合起来? 我个人认为这只是O(n),因为这是循环执行的次数,但是我想澄清一下为什么或为什么不这样做? 在我为期中考试做准备时,任何解释都将有所帮助。

for(int i = 0; i < a.length;i++){
        a[i] = b[i]
    }

考虑一下循环中的代码执行了多少次。 每个a[i] = b[i]发生a.length次,我们将其称为n 所以这是O(n)

循环执行n次,语句执行n次

但是n + n + n = 3n(大约)= k * n,其中k是恒定步长,仍然是O(n)

该循环为O(n) ,其中n是数组的长度。

您在循环内执行的运算为O(1) ,但由于您的循环而重复了n次,因此总计为O(1*n) = O(n)

例如,以下代码为O(n^2)

for(int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    a[i][j] = i+j;
  }
}

我们再次从内到外进行分析。 内部语句为O(1) ,但这由j-for循环执行了n次。 这导致内部(j)for循环为O(n) 接下来,我们将这个for循环运行n次,以使整个程序的O(n*n) = O(n^2)

这是否有助于回答您的问题?

那么,这将使它成为O(n ^ 2)还是我不将它们与其简单的O(n)结合起来?

只要循环中的代码在恒定时间内执行(因此没有其他循环或递归函数调用),您就可以忽略它。 不管您在循环中正在做什么,它都是O(n)。

查看Big-O表示法的一种好方法是,它表示算法的扩展方式

对于算法中的每个元素输入,必须采取多少对计算有意义的步骤才能产生所需的输出。 在此示例中,您的“在计算上有意义的步骤”是将b [i]的值分配给a [i]。 显然,这种情况发生的次数与数组中的元素次数一样多。 或抽象化它:它发生的次数与input元素的发生次数一样多 现在您可以了解为什么它是O(n)算法。

使其变为O(n ^ 2)的一个小修改是进行双嵌套循环,其中对于每个输入元素,必须将整个数组加在一起。

for(int i = 0; i < a.length;i++){
        for(int k = 0; k < b.length; k++) {
             a[i] += b[k]
        }
}

现在您可以看到,对于每个输入元素,我们都执行多个操作(m个操作,其中m是b数组的大小。)

作为有关Big-O符号的最后说明,这些符号有很多种(包括theta等)。 Big-O报告给定算法的最大缩放比例。 从技术上讲,这意味着您可以将算法描述为O(n ^ 50)且正确无误-这并不是您的老师可能会喜欢的答案。 您想要尽可能接近缩放比例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM