algorithm - 如何确定以下代码的时间复杂度
问题描述
public void test(int n)
{
for(i=1;i<=n;i=i*2)
{
for(j=1;j<n;j=j+(j*i))
{
// some code
}
}
}
上面的代码有两个循环。执行 log(n) 次的外循环。我们如何计算内部循环将执行的次数?上述代码的时间复杂度是多少?
解决方案
内部循环需要 log_{i+1}(n) 时间(log base i+1 of n)。假设 n 是 2 的幂,并使用基数公式的变化,转换为基数 2:log_{i+1)(n) = lg(n)/lg(i+1),这意味着“一些代码" 将执行多次:lg(n)/lg(2) + lg(n)/lg(3) + lg(n)/lg(5) + ... + lg(n)/lg(n +1)。
现在,1/lg(2) + 1/lg(3) + ... + 1/lg(n+1) <= 1 + 1/lg(2) + 1/lg(4) + ...1 /lg(n) = 1 + 1/1 + 1/2 + 1/3 + ... + 1/lg(n) ~= (1 + log(lg(n)))。
同样,1/lg(2) + 1/lg(3) + ... + 1/lg(n+1) >= 1/lg(4) + 1/lg(8) + ... + 1/ lg(2n) ~= (log(lg(2n)) - 1)。(使用谐波数的近似值:H(n) ~= log(n))。
因此,复杂度似乎是 log(n)log(log(n))。
这是一个非常粗略的证明,但希望能为您指明正确的方向。
推荐阅读
- unity3d - 加载 Admob 智能横幅时游戏崩溃
- azure - 在 azure cli 中显示现有 vm 大小的大小
- amazon-dynamodb - 如何在无服务器框架中使用全局二级索引定义 DynamoDB 表
- python - 从列表格式转换为显示相等的矩阵
- string - 如何修复“[thread1] SyntaxError: missing } after property list”
- php - 为什么在我重写 URL 时我的 $ _GET 变量中有一个零?
- python - ModuleNotFoundError:没有名为“tensorflow.python”的模块
- swift - XCUITest:是否可以不使用存在的静态文本而是使用标识符来点击元素?
- cuda - thread_groups 或 thread_block_tiles 是否有等效的 blockIdx?
- ios - 团队“TRRRRRRRRR”没有账号