【发布时间】:2016-05-29 22:15:40
【问题描述】:
我必须找出以下程序的时间复杂度:
function(int n)
{
for(int i=0;i<n;i++) //O(n) times
for(int j=i;j<i*i;j++) //O(n^2) times
if(j%i==0)
{ //O(n) times
for(int k=0;k<j;k++) //O(n^2) times
printf("8");
}
}
我对这个函数的分析如下:
i : O(n) : 1 2 3 4 5
j : : 1 2..3 3..8 4..15 5..24 (values taken by j)
O(n^2): 1 2 6 12 20 (Number of times executed)
j%i==0 : 1 2 3,6 4,8,12 5,10,15,20 (Values for which the condition is true)
O(n) : 1 1 2 3 4
k : 1 2 3,6 4,8,12 5,10,15,20 (Number of times printf is executed)
Total : 1 2 9 24 50 (Total)
但是我无法得出任何结论,因为我没有发现本质上为 O(n) 和 Total of k(最后一行)的 $i$ 之间有任何相关性。事实上,我不明白我们是否应该根据执行 printf 的次数来查看时间复杂度,因为这将忽略 j-for 循环的 O(n^2) 执行。给出的答案是 O(n^5),我认为这是错误的,但什么是正确的?为了更具体地说明我的困惑,我无法弄清楚 if(j%i==0) 条件如何影响函数的整体运行时复杂性。
【问题讨论】:
标签: time-complexity