如何解决内在的循环时间复杂度
int value2= 0;
int value1=0;
for (int i = 0; i < A.size(); i++)
for (int j = i; j < A.size(); j++) {
value2 = 0;
for (int k = i; k <= j; k++)
value2 += A[k];
if (value2 > value1)
value1 = value2;
}
q=clock()-q;
cout << "Total Time: "<< ((float)q)/CLOCKS_PER_SEC <<"\n";
cout <<"Result: " << value1 <<"\n";
我仔细研究了这些嵌套循环的关系数学,但是对于第二和第三循环的复杂性我确实感到困惑。我的第一个想法是第二个是n-1,而第三个是n,因为k
解决方法
Big O表示法用于表示“绑定”。因此,将A.size()
调用到n
,它可以是Big-O表示法中的O(n^3)
。
或更严格地说,第一和第二个循环是O(n^2)
,因为计数的总和是n + (n-1) + ... + (n - (n - 1)) = n*(n+1)/2
。 -(a)
第三个人仅受i
和j
的影响。让我们计算一下[i,j]
的间隔时间。
在Big-O的视野中,[i,j]
的长度可以假定为n
。 -(b)
因此(a)*(b)为O( (n*(n+1)/2) * n ) = O(n^3)
。
总之(用另一种方式),算完所有。
有n
个间隔,其大小为1
,例如:[0,0],[1,1],...,[n,n]
有n-1
个间隔,其大小为2
,例如:[0,2],[n-1,n]
...
只有1
个间隔,其大小为n
,例如:[n,n]
当i=0,j=n-1
时。
因此,n*1 + (n-1)*2 + ... + 1*n = (n-1)*n*(n+1) / 6
适用于所有循环。
Big-O表示法是O(n^3)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。