【问题标题】:What's the time-complexity function [ T(n) ] for these loops?这些循环的时间复杂度函数 [ T(n) ] 是多少?
【发布时间】:2021-10-19 17:18:39
【问题描述】:
j = n;
while (j>=1) {
    i = j; 
    while (i <= n) { cout<<"Printed"; i*= 2; }
    j /= 2; 
}

我的目标是找到 T(n)(为我们提供算法执行次数的函数),其顺序预计为 n.log(n),但我需要至少在 n=1 到 n 时可以正常工作的精确函数=10 个数据

我尝试过预测函数,最后以 *T(n) = floor((n-1)log(n)) + n结束>

仅适用于 n=1 和 n=2。

我应该提一下,通过将原始代码转换为 for 循环,我发现该函数不准确,如下所示:

for ( j = 1 ; j <= n ; j*= 2) {
    for ( i = j ; i<= n ;  i*=2 ) {
        cout << "Printed";
    }
}

最后,感谢您提前找到确切的 T(n) 的帮助。 ????

【问题讨论】:

  • 我编辑了您的帖子以提高可读性。我想知道:在您的第一个和第二个示例中,ij 的类型是什么?
  • @GuillaumeRacicot ,问题中没有提到它,所以考虑它是短整数和 10 Q 4 版本
  • @GuillaumeRacicot 和两种算法都做同样的事情,只是语法不同,所以我可以使用 log rep 公式
  • 内部循环执行 log(j) 次。外部循环执行 log(n) 次。由于 j ≤ n,可以安全地得出 T(n) = O((log n)²) 的结论,尽管证明 T(n) = Θ((log n)²) 可能需要更多的工作。跨度>

标签: c++ for-loop data-structures time-complexity complexity-theory


【解决方案1】:

使用log(x)是log based 2的底层

1.) 内部循环执行1+log(N)-log(j) 外部循环执行次数1+log(N) 其中j=1,2,4...N 倍整体复杂度是T(N)=log(N)log(N)+2*log(N)+1-(log(1)+log(2)+log(4)...+log(N))= log(N)^2-(0+1+2+...+log(N))+2*log(N)+1= log(N)^2-log(N)(log(N)-1)/2+1= log(N)^2/2+3*log(N)/2+1

2.) 此处相同,只是顺序相反。

我知道这不是证据,但可能比数学更容易理解:godbolt 与 n 一起玩。它总是返回 0;

【讨论】:

  • ln (x) 是以 e(Neper 数)为底的 x 的对数,我们称之为自然对数。您是指使用 ln(x) 以 2 为底的 log(x) 吗?
  • 通常我不会关心用于日志的基数,因为无论如何所有日志都相差一个乘法常数。但是,我建议使用log 而不是lnln 一直表示“自然对数”,即以 e 为底的对数。
  • 我没看第一行,明白了
  • @Stef 没错,因为我们认为 log(n) = 计算机科学中以 2 为底的 (n) 的对数
  • 我编辑了它,所以现在它是正确的。我首先计算错误,我还使用log 而不是ln 重写了
【解决方案2】:

外循环和内循环都是O(log₂ N)

所以总时间是

O(log₁₀ N * log₂ N) == O(2 * log₂ N)

这只是减少到O(lg N)

【讨论】:

  • 请注意 (log(n))² ≠ 2log(n),并且 O((log n)²) ⊄ O(log(n))
  • @selbie ,你如何找到第二个的 log2(n) ?如果你遵循 log(upper-bound) - log(lower-bound) + 1 的公式,第二个对数中的 j 是一个中断,除了它们的乘法不能减少所以它是 pow (log , 2 )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多