Time Complexity of a loop is considered as O(Logn) if the loop variables is divided / multiplied by a constant amount.
loop 1 ----
for (int i = 1; i <=n; i *= c)
{
// some O(1) expressions
}
loop 2 -----
for (int i = n; i > 0; i /= c)
{
// some O(1) expressions
}
Time Complexity of a loop is considered as O(LogLogn) if the loop variables is reduced / increased exponentially by a constant amount.
Here c is a constant greater than 1
loop 3 ----
for (int i = 2; i <=n; i = pow(i, c))
{
// some O(1) expressions
}
loop 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
}
Can anyone explain me why it is by considering the number of times the inner loop executes in these loops?
If c=1 in loop 1 and loop 2 then it will run infinite times right but it is given as logarithimic time why?
how is it O(loglogN) in loop 3 and loop 4?
Yes you are right, if
c = 1
then we will get infinite loops for both case 1 and case 2, so the condition "c
is a[n integer] constant greater than 1" is also necessary for both case 1 and case 2 in order to get theO(log n)
complexity.For case 1, note that
i
takes values1, c, c2, c3, ..., clogc(n)
, so there are in totallog(n)
many iterations, and for each iteration there is a constant amount of work to be done (i.e.O(1)
amount of work), so the total amount of work done islog(n) * O(1) = O(log(n))
.Similarly for case 2,
i
takes valuesn, n / c, n / c2, n / c3, ..., , n / clogc(n)
, so there are in totallog(n)
many iterations and each iteration takes constant amount of time, so the total time complexity isO(log(n))
.For case 3,
i
takes values2, 2c, (2c)c = 2c2, (2c2)c = 2c3, ..., 2clogc(log(n))
. The last term has to be less than or equal ton
, and we have2clogc(log(n)) = 2log(n) = n
, which justifies the value of our last term. So there are in totallogc(log(n))
many iterations, and each takes a constant amount of time to run, therefore the total time complexity isO(log(log(n)))
.Similarly for case 4,
i
takes valuesn, n1/c, (n1/c)1/c = n1/c2, n1/c3, ..., n1/clogc(log(n))
, so there are in totallogc(log(n))
iterations and each iteration takes timeO(1)
, so the total time complexity isO(log(log(n)))
.