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,那么索引变量必须像 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++) {
// ...
}
}
推荐阅读
- node.js - Error: You must provide the json interface of the contract when instantiating a contract object
- maxima - wxMaxima:将除法视为乘法(将整体除法收集为乘法因子)
- html - 无法使输入(复选框)遵循 CSS 绝对定位
- javascript - Node/Express:使用来自另一个文件的函数请求
- tensorflow - 在 Google Coral Devboard 和 Jetson Nano 中使用我自己构建的卷积神经网络分类器
- javascript - Spring DWR engine.js 失败未知错误
- symfony - 弃用模板必须包含“%service_id%”占位符
- java - 将 JSON 序列化程序设置为使用单引号而不是双引号来附加值
- c# - C# FtpWebRequest 失败,成功时抛出异常
- dpdk - pkt-gen dpdk 不发送任何数据包问题