📜  当循环变量“成倍增加或减少”时,循环的时间复杂度

📅  最后修改于: 2021-04-27 23:38:49             🧑  作者: Mango

对于此类情况,循环的时间复杂度为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/