[英]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.