【问题标题】:Simple Algorithm complexity简单算法复杂度
【发布时间】:2015-05-12 11:25:50
【问题描述】:

我有一个算法,我需要帮助找出它的复杂性(尽可能严格的上限)

for(int i = 0; i < n/2; i++)
    for(int j = 0; j < n/4; j++)
        for(int k = 0; k < n; k++)
            x++;

我的分析是,如果n在每个for循环中不被分割,那就是O(n^3)。这种复杂性仍然成立,因为每个“for 循环”都会将每个操作降低到 O(log n) 复杂性,因为它在每次循环执行时都将 n 相除,使其越来越小(至少小于 O(n))。

我会说答案在O(log n)O(n^3) 之间。你能帮我弄个最紧的界限吗?

【问题讨论】:

  • n 永远不会被修改 => 复杂性 Θ(n * (n/4) * (n/2)) = Θ(n³)

标签: java algorithm complexity-theory code-complexity


【解决方案1】:

从内循环开始:

for(int k = 0; k < n; k++)
    x++;

显然是 O(n)。

现在在上面一层:

for(int j = 0; j < n/4; j++)

是 O(n) 因为 j 需要 n/4 才能到达 n 并且我们知道 O(n/4) = O(n)

这样的外部循环是 O(n)。所以复杂度是 O(n^3) 因为你有三个嵌套循环,每个循环都有 O(n) 并且它们之间没有相互影响。

【讨论】:

  • 好的!所以这个算法可能的最严格的界限确实是 O(n^3) ?
【解决方案2】:

假设每一步都需要时间 C. 对于 k 循环,所用时间为 Cn。 对于 j-loop,完成迭代所需的时间为 (Cn)n/4=C(n^2)/4 对于 i-loop,完成迭代所需的时间为 (C*(n^2)/4)n/2=C(n^3)/8

所以总耗时=(C/8)*(n^3)

由于 C/8 是一个常数,在考虑 Big-O 表示法时可以忽略它。 因此,时间复杂度=O(n^3)。

【讨论】:

  • 我的答案是 urs
【解决方案3】:
for(int i = 0; i < n/2; i++)    --> n/2
    for(int j = 0; j < n/4; j++)  --> n/4
        for(int k = 0; k < n; k++)  --> n
            x++;

因此总复杂度为O((n^3)/8),即O(n^3)

【讨论】:

  • 如何从 O(n^3/8) 到 O(n^3)?
  • 8 是常数,可以忽略
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多