是否有一个具有两个循环(嵌套)的算法,使得总时间复杂度为O(log(log n))
这是在解决以下问题之后出现的:
/etc/letsencrypte/renewal/example.com.conf
以上代码的时间复杂度为N。(使用“几何级数”的概念)。是否可以存在时间复杂度为O(log(log n))的类似循环?
答案 0 :(得分:3)
要使一个循环迭代O(log log n )次,其中循环索引变量的计数最多为 n ,则索引变量必须像逆变量一样增长日志 k 的函数,其中 k 是迭代次数;即它必须增长到2 ^ 2 ^ k 或2以外的其他基数。
实现此目的的一种方法是从2开始并反复平方直到达到 n -如果索引变量为(((2 ^ 2)^ 2)... ^ 2) k 平方,则根据需要等于2 ^ 2 ^ k :
for(int i = 2; i < n; i = i*i) {
//...
}
此循环根据需要迭代O(log log n )次。如果绝对必须使用嵌套循环,则可以添加一个额外的循环,该循环迭代O(1)次,使迭代总数渐近相同:
for(int i = 2; i < n; i = i*i) {
for(int j = 0; j < 10; j++) {
// ...
}
}