for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++){
//do swap stuff, constant time
}
}
我读到单个for循环是O(N)并且遍历它两次将使它成为O(n ^ 2)我观看了相关的教程,这表明每个操作都需要1 - O(1)的单位。我想详细了解O(n ^ 2)实际上是如何出现的。我试着为每个陈述做数学,但我相信我做得不对。如果有人可以从字面上向我展示如何嵌套for循环变为O(n ^ 2),我将不胜感激。先谢谢
答案 0 :(得分:1)
你需要使用古老而模糊的数学艺术并计算内部陈述的执行次数。
在你的情况下,内循环执行了一次。 i的值为0,1,2,...,n-1。所以你需要一个计算这个总和的公式,这就是你的结果。
您读到单个循环是O(n)。那是胡说八道。这取决于循环。
for (i = 1; i < n; i *= n)
不会迭代n次。它迭代log2(n)次,这通常要少得多。您需要查看实际代码并弄清楚。对此没有简单的规则。
答案 1 :(得分:1)
如你所说
每个单位为1 - O(1)
因此内循环的每次迭代都需要1,2,3,...,n单位时间。
total_time = 1 + 2 + 3 + ... + (n-2) + (n-1) + n
倒车
total_time = n + (n-1) + (n-2) + ... + 3 + 2 + 1
添加
2 * total_time = (n+1) + (n+1) + (n+1) + ... + (n+1) + (n+1) + (n+1)
共有n个术语
2 * total_time = (n+1) * n
=> total_time = (n+1) * n / 2
=> total_time = n^2 / 2 + n / 2
对于大O复杂度,忽略较低项和常系数。
结果
<强>为O(n ^ 2)强>
答案 2 :(得分:0)
一个从i = 1循环到n然后有一个从1到i的内部循环的函数会经过一个等于这个公式的迭代次数:
N(N + 1)/ 2
正如你所看到的,当我们除去主要指数之外的所有东西时,你以O(n ^ 2)结束