【问题标题】:T(n) for a nested loop嵌套循环的 T(n)
【发布时间】:2020-10-01 16:27:03
【问题描述】:

谁能帮我找到 T(n),内循环将作为 n 的函数运行的次数,用于以下循环:

for (int i = 0; i < n; i++)
    for (int j = i; j > 0; j /= 2)
        cout << j << endl;

只看这个我知道大O是O(n*log(n)),但我也应该弄清楚T(n)

我已经运行了代码并找到了语句执行的次数。我想出了一个系列,但我还没有想出如何简化它:

log_2(n-1)+1+log_2(n-2)+1+log_2(n-3)+1+.......

我尝试使用对数积规则将其简化为

T(n)=log_2((n-1)!2^2)) 

但这不满足方程。

*已编辑以解释我所说的 T(n) 的意思

【问题讨论】:

  • “T(n)”是什么意思?这不是像 Big-O 表示法那样的标准术语。
  • 您是否要准确找出循环运行的次数?最差的情况? T(n) 对我来说也没有任何意义,所以请解释一下。
  • 假设您知道T(n) 是什么。那么如果n增加1,你还需要做多少工作呢?好吧,你必须再做一次内循环。内部循环从i(大约是n)到0,每次减半。所以你会得到类似T(n) = T(n-1) + log_2(n)

标签: c++ algorithm math time-complexity big-o


【解决方案1】:

T(n),我认为您的意思是“基本操作”数量的函数,用于大小为 n 的输入。首先,您必须选择“基本操作”。在这种情况下,cout &lt;&lt; j &lt;&lt; endl 似乎是一个合理的选择。

让我们从一些更简单的例子开始:

for (int i = 0; i < n; i++)
    cout << i << endl;

(由于我这里不能使用 sigma 表示法,所以我将写 sum(a, b, c),其中a 通常写在 sigma 下方,b 写在 sigma 上方,c 写在右侧西格玛。)

for 循环的分析基于求和。每个输出操作我们执行一次,所以T(n) = sum(i = 0, n - 1, 1)。我们可以通过数学归纳法证明T(n) = n

由于这与您的外部 for 循环相同,我们可以写为 T(n) = sum(i=0, n, THE NUMBER OF STEPS FOR THE INNER LOOP)

要分析内部循环,我们首先要注意我们是否按相反方向计数:

for (int i = n; i > 0; i--)
    cout << i << endl;

分析是一样的。

现在让我们做一些更复杂的事情:

for (int i = n; i > 0; i /= 2)
    cout << i << endl;

我们需要使用 sigma 表示法计算步数,因此我们将转换代码几次,同时保留执行的步数。就像我们之前的计数示例具有相同的步数一样,我们可以将其写为

for (int i = 0; i < n; i *= 2)
    cout << i << endl;

我知道输出会有所不同,但我们只关心步数。

我们需要再做一次转换,因为 sigma 表示法总是加一:

for (int i = 0; i < n/2; i++)
    cout << i << endl;

现在这看起来很像我们的第一个示例:T(n) = sum(i=0, n/2 - 1, 1) = n/2

所以现在我们可以将内循环的总和添加到我们的函数中:

T(n) = sum(i=0, n, sum(j=i, n/2 - 1, 1))

最后一步是求解封闭公式的总和。这留给读者作为练习。

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多