时间复杂度为 log(log n) 的嵌套循环
Nested loops with time complexity log(log n)
能否有一个算法有两个循环(嵌套),使得总时间复杂度为 O(log(log n))
这是在解决以下问题后出现的:
for(i=N; i>0; i=i/2){
for(j=0; j<i; j++){
print "hello world"
}
}
以上代码的时间复杂度为N。(使用几何级数的概念)。是否存在时间复杂度为 O(log(log n)) 的类似循环?
对于循环迭代O(log log n)次,其中循环索引变量计数到n,则index 变量必须像 log log 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++) {
// ...
}
}
能否有一个算法有两个循环(嵌套),使得总时间复杂度为 O(log(log n))
这是在解决以下问题后出现的:
for(i=N; i>0; i=i/2){
for(j=0; j<i; j++){
print "hello world"
}
}
以上代码的时间复杂度为N。(使用几何级数的概念)。是否存在时间复杂度为 O(log(log n)) 的类似循环?
对于循环迭代O(log log n)次,其中循环索引变量计数到n,则index 变量必须像 log log 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++) {
// ...
}
}