如何解决如何计算以下代码的时间函数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
将增加x
,d
变成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)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。