对于此类情况,循环的时间复杂度为O(log(log(n())))。以下情况分析了问题的不同方面。
情况1 :
for (int i = 2; i <=n; i = pow(i, k))
{
// some O(1) expressions or statements
}
在这种情况下,i取值2,2 k ,(2 k ) k = 2 k 2 ,(2 k 2 ) k = 2 k 3 ,…,2 k log k (log(n)) 。最后一项必须小于或等于n,并且我们有2 k log k (log(n)) = 2 log(n) = n,这与我们上一项的值完全一致。因此,在总log k (log(n))中有许多迭代,并且每次迭代都花一定的时间运行,因此总时间复杂度为O(log(log(n)))。
情况2:
// func() is any constant root function
for (int i = n; i > 1; i = func(i))
{
// some O(1) expressions or statements
}
在这种情况下,i取值n,n 1 / k ,(n 1 / k ) 1 / k = n 1 / k 2 ,n 1 / k 3 ,…,n 1 / k log k (log(n)) ,因此总共有log k (log(n))次迭代,每个迭代花费时间O(1),因此总时间复杂度为O(log(log(n)))。
请参阅下面的文章,以分析不同类型的循环。
https://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/