如何计算以下代码的时间函数Tn?

问题描述

x=0;
for(int i=1 ; i<=n ; i++){
    for(int j=1 ; j<=n ; j++){
        x++;
        n--;
    }
}

通过测试代码,嵌套的FOR循环在第一个For循环的每一步中重复⌈n/2⌉次。

但是我不知道如何用西格玛来制定这些规则。如果有人可以帮助我,我将非常感谢。

解决方法

您可以将T(n)表示为T(n-2)+1,即T(n)= T(n-2)+1或它的预期时间复杂度为O(n / 2)=> O( n)。

编辑:对T(n-2)+1表达式进行求值,您可以看到如果n-2增加n-2时将n-2加2,则执行循环的次数为1 +数对n-2执行时间循环。 1是因为您同时在递增j和在递减n。它与将j增加2完全相同。

,

让我们计算get_context_data的确切值。

TL; DR:x,其中x(N) = N-[N/2^i+1]是最低数字,满足条件:i。如 Mariano Demarchi 所说,(i+1) 2^i > N


首先,我们将检查每个内部循环后变量如何变化。让我们在代码中(内部循环之前)在2至3行之间设置T(N)=O(N)值:

  • 将发生多少次迭代?每次迭代增加(n,i,x)并减少j,因此它们之间的距离减少了两倍。起始距离为n,最后一次循环后为n-1(如果0为奇数)或n(如果-1为偶数)。因此,如果为n,则答案为n=2k,否则为k。因此,内部循环进行了k+1次迭代。
  • 因此[(n+1)/2] = d将增加xd变成n,而n-d变成i
  • i+1或等于(n,x) -> (n-d,i+1,x+d)

现在将重点放在大循环中的([n/2],x + [(n+1)/2])n变量的值上:

  • 它们的变化如下:i
  • 停止条件为(n,i) -> ([n/2],i+1),等于[N/2^i] < i+1。当然,我们需要最少的(i+1)*2^i > N才能满足条件。

因此,i是满足条件的第一个数字,我们请勿求和

i

根据数论魔术(与这个问题无关),该级数等于 x = [(N+1)/2] + [([N/2]+1)/2] + [([N/2^2]+1)/2] + ... + [([N/2^i-1]+1)/2] 。特别是,如果N (1-1/2^i+1)是2的幂乘以1,我们可以很容易地看到它。

因此,此代码在N时间返回完全相同的值。

O(log(N))
,

在内部循环中,假设n在j递增的同时递减,则在两个初始值之差(n-1)/2的中间,n将低于j。 因此,您的测试表明,内循环在外循环的每次迭代中运行⌈n/2⌉次。

然后,对于满足此等式n/2^i = i-1的i,外部循环将停止。这会影响外循环停止条件。

T(n)

=

n/2 + T(n/2)

=

n/2 + n/4 + T(n/4)

=

n (1/2 + 1/4 + ... + 1/(2^i)) 

该系列收敛到n,因此算法为O(n)