大家好,我试图计算最大子序列和的时间复杂度。实际上我知道答案是 O(n^3) 并且它来自函数 (n^3 + 3n^2 + 2n)/6
我的问题是如何获得该功能。
大家好,我试图计算最大子序列和的时间复杂度。实际上我知道答案是 O(n^3) 并且它来自函数 (n^3 + 3n^2 + 2n)/6
我的问题是如何获得该功能。
实际上很简单:只需查看代码中的循环即可。
for (int i=0; i<n; i++)
for(j = i; j<n; j++) {
...
for (int k=i; k<=j; k++)
XXX;
该行XXX
是执行n^3
次数(模一些常数因子和 的一些较低幂n
),因为外部循环显然从0
to运行n-1
,“中间”循环从i
(将从0
, 1
, ... 开始)到n-1
,这意味着内循环将“开始”大约n^2
次。现在,两者都i
依赖j
于n
(例如,i
将是0
和j=n-1
在第一次外部迭代结束时),所以 lineXXX
将n
乘以(对于内部循环)n^2
乘以(对于外部两个循环),总共是n^3
.
要获得具体的功能(n^3 + 3n^2 + 2n)/6
,您必须在计算中更加彻底,并注意我在上面省略的所有因素。
这是如何..
i=0
j=0 k=0 (count=1 )
j=1 k=0,1 (count =2)
j=2 k=0,1,2 (count = 3)
...
j=n-1 k=0,1,2,...n-1 (count = n)
Total number of times code executed = 1+2+3+...+n = n(n+1)/2
i=1
j=1 k=1 (count=1 )
j=2 k=1,2 (count =2)
j=3 k=1,2, 3 (count = 3)
...
j=n-1 k=1,2,...n-1 (count = n-2)
Total number of times code executed = 1+2+3+...+n-1 = (n-1)n/2
...
i=n-1
j=n-1 k=n-1 ( count = 1)
Total number of of times code executed = 1 = 1(1+1)/2
Now if we sum for all the values of i
n(n+1)/2 + ((n-1)((n-1)+1)/2+.....+1(1+1)/2
=∑ N(N+1)/2 =1/2∑(N^2 +N) =1/2(∑N^2+∑N)=1/2{ 1/6 N(N+1)(2N+1) + 1/2 N(N+1) } =1/2{ (2N^3 + 3N^2+N )/6 +(N^2+N)/2} =(N^3 + 3N^2 + 2N)/6
检查Mark Allen Weiss 建议的这个解决方案(在他的书中)。