读书人

问个时间复杂度有关问题

发布时间: 2012-04-05 12:42:40 作者: rapoo

问个时间复杂度问题

  x=91; //1
  y=100; //1
  while(y>0) //1101
    if(x>100) //1100      { x=x-10; //100
      y--; //100
     }
    else
     x++; //1000
  以上程序段右侧列出了执行次数。该程序段的执行时间为:       T(n)=O(1)

这个执行时间为什么是O(1)

  i=0; //1
  k=0; //1
  do{ //n
    k=k+10*i; //n
    i++; //n
   }
  while(i<n);//n
由以上列出的各语句的频度,可得该程序段的时间消耗:
  T(n)=1+1+n+n+n+n=4n+2
可表示为T(n)=O(n)

这个为什么又是O(n)
希望大家帮忙

[解决办法]
第一个也是O(n)
把Y看成n其实循环至少n次 * x的次数
其实复杂度更高
[解决办法]
程序的复杂度,是指程序在最坏的情况下(运行次数最多的情况下)的运行次数.而且用了数学的高阶无穷小的概念.
所谓O(1),并不是说程序只运行一次,而是指程序运行的次数是个常数,不随变量的规模变化而变化.比如一个程序无论输入变量是多少都可以在10000次内完成,那我们就可以说这个程序的复杂度为O(1),虽然是运行了10000次,但是因为是个常数,所以也是O(1).
对于4N+2这样的执行次数,考虑到在最坏情况下,即当N趋于无穷大时,程序运行的复杂度取多项式中的最高次幂的权值,4N+2,最高次为N的一次方,取权值(也就是去掉系数),复杂度为O(N).
同样,比如某程序执行的次数为8N*N+3N+1次,当N趋于无穷大时,最高次幂项为8N*N,所以复杂度为O(N*N).
复杂度只是在大概体现了程序的运算规模,规模的大小往往是数量级的差距我们才能从复杂度上来体现,但是复杂度并不能精确地体现程序的执行次数.一个5N次和一6N次的程序的复杂度都是O(N),他们肯定比O(N*N)要运行次数少,但是光从复杂度的角度,你无法体现这两个程序的执行次数的多少.

读书人网 >C语言

热点推荐