主题:关于时间复杂度计算的问题
老西儿
[专家分:150] 发布于 2006-06-29 15:23:00
(1) x=1;
(2) for(i=1;i<=n;i++)
(3) for(j=1;j<=i;j++)
(4) for(k=1;k<=j;k++)
(5) x++;
该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数:
[img]file:///C:/gailun2.gif[/img]
则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)。
我实在搞不懂执行次数公式是如何推导出来的,用到了哪些数学知识?
[em10]
回复列表 (共5个回复)
沙发
euc [专家分:4310] 发布于 2006-06-29 20:45:00
多看点例子,感觉和算法分析很重要,没什么好算的。
板凳
InitInstance [专家分:8720] 发布于 2006-06-29 21:49:00
时间复杂度比时间频度(执行次数)容易算出,有时看就出来了.....
3 楼
aboutbmp [专家分:830] 发布于 2006-06-30 09:19:00
组合数学的知识。
每一组满足 k≤j≤i≤N的(i,j,k)值对应一次最内层的操作。
问题与从N种不同颜色的球中挑出3个球(允许重复)的方案数等价。
结果为C(N+2,3) = (N+2)(N+1)N/6, C(m,n)是组合数。
4 楼
老西儿 [专家分:150] 发布于 2006-07-02 17:45:00
明白了!非常感谢三楼兄弟的指教!
5 楼
rickone [专家分:15390] 发布于 2006-07-02 22:45:00
你可以粗略的观察看出来,让n变得非常大,那每个循环都会是n量级的,所以感觉就是O(n3)
我来回复