根据循环层数判断时间复杂度,这样合理吗?

yysx 2014-09-30 10:56:55
按循环层次来判断的话:
下面的例子

for(i=1,i<=n; ++i)
for(j=1; j<=n; ++j)
{ c[i][j]=0 ;
for(k=1; k<=n; ++k)
c[i][j]+=a[i][k]*b[k][j] ;
}

时间复杂度为O(n3)

for(i=1; i<=n; ++i)
    for(j=1; j<=n; ++j)
{ ++x; s+=x ; }
其时间复杂度为:O(n2)

但下面的例子就不同了

i=0;s=0;
while(s<n){
i++;
s=s+i;
}
虽然是一层循环,但它的时间复杂度却是O(√n) n的开方。
这是为什么呢?如果不能按循环层次来看,又有什么比较方便的方法吗?
...全文
325 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yysx 2014-10-07
  • 打赏
  • 举报
回复
不能单纯的看循环的层次,而要看具体执行的次数。
FancyMouse 2014-10-01
  • 打赏
  • 举报
回复
引用 6 楼 u010066934 的回复:
[quote=引用 4 楼 FancyMouse 的回复:] 没有方便的方法。该怎么算就怎么算。能乘起来那都是因为求和号可以分开来,仅此而已。等你什么时候会分析这个了那大概是悟了

memset(c, 0, sizeof(c));
for(int i=2;i*i<=n;i++)
  if(c[i] == 0)
    for(int j=i*i;j<=n;j+=i)
      c[j] = 1;
我的意思是,大部分的时间复杂度问题都可以看有几个循环来看出来,但是上面的第三个例子不行,我想知道为什么[/quote] 数学上的拆分求和号而已。sum_{i=1~n} sum_{j=1~n} sum_{k=1~n} 1 = (sum_{i=1~n} 1) * (sum_{j=1~n} 1) * (sum_{k=1~n} 1) = n*n*n
jwj070524 2014-09-30
  • 打赏
  • 举报
回复
s(0)=0,s(1)=1,s(2)=3... s(i+1)=s(i)+i 假设循环最多K次的话,那么1+2+3+...+k >= n 得到k(k+1)/2 >= n k(k+1) >= 2n 所以只要k>=sqrt(2n)就行了,最后循环的时间复杂度就是O(sqrt(n))
yysx 2014-09-30
  • 打赏
  • 举报
回复
引用 1 楼 nice_cxf 的回复:
是简单的乘积关系,但是要看每层循环的执行次数
能再具体点嘛
nice_cxf 2014-09-30
  • 打赏
  • 举报
回复
是简单的乘积关系,但是要看每层循环的执行次数
Sky丶Memory 2014-09-30
  • 打赏
  • 举报
回复
第三个例子你要看i执行的次数,程序要求的是而s = (1 + 2 + 3... + i) = i * (i + 1) / 2 > n大于s时,你发现i执行的次数就是sqrt(n),一般是不能看循环次数判断时间复杂度的
aambrosio 2014-09-30
  • 打赏
  • 举报
回复
需要看每个循环具体执行了多少次!
yysx 2014-09-30
  • 打赏
  • 举报
回复
引用 4 楼 FancyMouse 的回复:
没有方便的方法。该怎么算就怎么算。能乘起来那都是因为求和号可以分开来,仅此而已。等你什么时候会分析这个了那大概是悟了

memset(c, 0, sizeof(c));
for(int i=2;i*i<=n;i++)
  if(c[i] == 0)
    for(int j=i*i;j<=n;j+=i)
      c[j] = 1;
我的意思是,大部分的时间复杂度问题都可以看有几个循环来看出来,但是上面的第三个例子不行,我想知道为什么
yysx 2014-09-30
  • 打赏
  • 举报
回复
引用 3 楼 jwj070524 的回复:
s(0)=0,s(1)=1,s(2)=3... s(i+1)=s(i)+i 假设循环最多K次的话,那么1+2+3+...+k >= n 得到k(k+1)/2 >= n k(k+1) >= 2n 所以只要k>=sqrt(2n)就行了,最后循环的时间复杂度就是O(sqrt(n))
也就是说不能只看有几个循环来判断了
FancyMouse 2014-09-30
  • 打赏
  • 举报
回复
没有方便的方法。该怎么算就怎么算。能乘起来那都是因为求和号可以分开来,仅此而已。等你什么时候会分析这个了那大概是悟了

memset(c, 0, sizeof(c));
for(int i=2;i*i<=n;i++)
  if(c[i] == 0)
    for(int j=i*i;j<=n;j+=i)
      c[j] = 1;

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧