如果将循环变量除以/乘以常量,则循环的复杂度被视为O(Logn)。
循环1 ----
for (int i = 1; i <=n; i *= c)
{
// some O(1) expressions
}
循环2 -----
for (int i = n; i > 0; i /= c)
{
// some O(1) expressions
}
如果循环变量以指数方式减少/增加一个恒定量,则循环的时间复杂度被视为O(LogLogn)。
Here c is a constant greater than 1
循环3 ----
for (int i = 2; i <=n; i = pow(i, c))
{
// some O(1) expressions
}
循环4 -----
////Here fun is sqrt or cuberoot or any other constant root
for (int i = n; i > 0; i = fun(i))
{
// some O(1) expressions
}
任何人都可以通过考虑内循环在这些循环中执行的次数来解释原因吗?
如果在循环1和循环2中c = 1,那么它将无限次地运行,但它是以对数时间给出的?
循环3和循环4中的O(loglogN)如何?
答案 0 :(得分:1)
如果在循环1和循环2中c = 1,那么它将无限次地运行,但它是以对数时间给出的?
是的你是对的,如果c = 1
那么我们将为案例1和案例2得到无限循环,所以条件&#34; c
是一个[n整数]常量大于1 &#34;对于案例1和案例2也是必要的,以便获得O(log n)
复杂性。
对于案例1,请注意i
取值1, c, c2, c3, ..., clogc(n)
,因此总共有log(n)
次迭代,并且每次迭代都有一定量的工作要做(即O(1)
工作量),因此完成的工作总量为log(n) * O(1) = O(log(n))
。
类似于案例2,i
取值n, n / c, n / c2, n / c3, ..., , n / clogc(n)
,因此总共有log(n)
次迭代,每次迭代都需要一定的时间,因此总时间复杂度为{{ 1}}。
对于案例3,O(log(n))
取值i
。最后一个词必须小于或等于2, 2c, (2c)c = 2c2, (2c2)c = 2c3, ..., 2clogc(log(n))
,我们有n
,这证明了我们上一学期的价值。因此总共有2clogc(log(n)) = 2log(n) = n
次迭代,并且每次迭代都需要运行一段时间,因此总时间复杂度为logc(log(n))
。
类似于案例4,O(log(log(n)))
取值i
,因此总共n, n1/c, (n1/c)1/c = n1/c2, n1/c3, ..., n1/clogc(log(n))
次迭代,每次迭代需要时间logc(log(n))
,因此总时间复杂度为{ {1}}。