【问题标题】:Nested Loop Time Complexity for( i = n; i > 0; i /= 2) VS for( i = n; i > 0; i/=2) for( j = 0; j < i; j++)嵌套循环时间复杂度 for( i = n; i > 0; i /= 2) VS for( i = n; i > 0; i/=2) for( j = 0; j < i; j++)
【发布时间】:2019-06-13 13:58:52
【问题描述】:

我无法找出算法 A 和算法 B 的时间复杂度,请大家帮帮我!!!

算法 A:

for(int i=n; i>=1; i/=2)
    some statement  

如果我没记错的话,

i = n;
i = n / 2 to the power of 1;
i = n / 2 to the power of 2;
i = n / 2 to the power of 3;
i = n / 2 to the power of 4;
.................
.................
i = n / 2 to the power k;

Algo A terminate when,

n / 2 to the power of k < 1
Therefore k = log n, Algo A take logn time;

算法 B:

for(i=n; i>=1; i/=2)
   for(j=0; j<i; j++)
      some statement

伙计们,我无法找出算法 B 的时间复杂度,所以如果我对算法 A 有误,如何计算并纠正我

【问题讨论】:

  • 如果“某个语句”在恒定时间内运行,则算法 A 确实运行在 O(log n) 中。计算算法B的时间复杂度遇到了什么麻烦?
  • some statement 相同的逻辑是一个简单的循环(我希望你知道它的复杂性)。
  • 如果同样的逻辑适用于算法 B “some statement” 执行 n + n/2 + n /4........n / 2 的 k 次方,那么复杂度将是 O(logn) 还是 O(N) ?

标签: java data-structures time-complexity big-o


【解决方案1】:

简答:如果“some statement”在恒定时间内运行,则算法B运行在O(n)。

我们先分析一下内循环:

for(j=0; j<i; j++)
    some statement

由于j0(包括)迭代到i(不包括),因此意味着它将执行i 操作。

现在我们可以分析外部:

for(i=n; i>=1; i/=2)
    // i operations

这里i因此以n开头,每次除以2,每次迭代,我们执行i任务。

这意味着任务的总数是:

 n + n/2 + n/4 + n/8 + ... + 1

以上是已知序列:

 m
---
\          -k           -m
/     n * 2     = (2 - 2  ) n
---
k=0

这里k因此范围从0log2n,因此指令的总数是(2 -2log2n)× n(2 - 1/n)× n 因此 2× n - 1。我们可以将其简化为 O(n)

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2022-01-13
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2021-06-09
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多