程序的时间和空间复杂度

来源:互联网 发布:硬盘数据彻底删除软件 编辑:程序博客网 时间:2024/05/22 13:04

一、时间复杂度概念



时间复杂度是程序执行所耗费的时间,一般是通过机器进行测试,但通过理论分析也同样能够得出

两个概念:

(1)时间频度:一个算法中语句的执行次数,是一个具体的数值,通常用T(n)来表示,n代表问题的规模

(2)时间复杂度:随着n的不断变化,T(n)/f(n)逐渐趋近于一个常数,我们使用O(f(n))来表示时间复杂度

其实上面用到的就是一个等价无穷小的概念

常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)


 

二、时间复杂度计算



(1)找出算法中的基本语句

算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。


(2)计算基本语句的执行次数的数量级

只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数


(3)用大Ο记号表示算法的时间性能

将基本语句执行次数的数量级放入大Ο记号中。



三、程序举例


(1)O(1)的时间复杂度

这里要注意的是,不管程序有多少行语句,只要其没有涉及到可以变得n,那么他就是一个简答的程序,例如下面的程序

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片   
  1. int i = 1000;
  2. while(n != 0){    
  3. i--;   
  4. }   

(2)O(n)的时间复杂度

程序前两行的时间频度是2,第4行的时间频度是n,第5行的时间频度是n,总时间频度是2n+2,时间复杂度是O(n)

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片   
  1. int a = 1
  2. int b = 2
  3. for(int i = 0; i < n; i++){
  4. a = a + b;
  5. b++;
  6. } 


(3)O(log2n)的时间复杂度

程序第一行的频度是1,第三行的频度是f(n),则2^f(n)<=n, f(n)<=log2n   

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片   
  1. int i = 1;
  2. while(i < n){
  3. i * = 2;

(4)O(n2)的时间复杂度

因为O(2n2+n+1)=n2(去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)= =O(n2);

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片   
  1. int sum = 0;
  2. for(int i = 0; i <= n; i++){
  3. for(int j = 0; j <= n; j++){
  4. sum++;
  5. }


四、空间复杂度


空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。 


序执行时所需存储空间包括以下两部分。  
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))  其中n为问题的规模,S(n)表示空间复杂度。



尊重作者,尊重原创,参考文章:

http://blog.csdn.net/zolalad/article/details/11848739
http://blog.csdn.net/booirror/article/details/7707551
1 0