C++时间复杂度与空间复杂度

来源:互联网 发布:windows桌面增强小工具 编辑:程序博客网 时间:2024/06/10 22:48


        程序性能是指一个程序对内存和时间的要求,因此空间复杂度和时间复杂度对衡量一个程序的性能而言颇为重要。

     1、空间复杂度——即该程序的运行所需内存的大小

           程序所需空间由指令空间数据空间环境栈空间组成;
           a、指令空间是指编译之后的程序指令所需要的存储空间(不同编译器编译同一段代码所占的指令空间可能不同)
           b、数据空间是指所有常量变量所需的存储空间(包含常量和简单变量,以及动态对象所需的空间)
       
           c、环境栈空间用来保存暂停的函数和方法在恢复运行时所需要的信息,当一个函数被调用时,函数的返回地址和正在调用的函数的所有局部变量的值以及形参的值都会被保护在环境栈中。

          实例特征:程序处理的问题实例都有一些特征,例如,对n 个元素排序的程序,所需的空间大小是n的函数,n就为其实例特征。
          可把一个程序所需空间分成两部分:
           a、固定部分,独立于实例特征(通常包括指令空间,简单变量空间和常量空间等)
           b、可变部分(对实例特征有依赖的动态分配空间和递归栈空间)

          所以,任何程序P所需的空间可以表示为:c+Sp(实例特征)
          其中c为一个常量,表示空间需求的固定部分,Sp表示空间需求的可变部分,在计算空间复杂度时,集中计算Sp。
代码1:
int sum(int a[],int n){//返回数组元素a[0:n-10]的和   int thesum = 0;   for (int i = 0; i < n; i++)        theSum +=a[i];   return theSum;}
         对于上述代码1的函数sum,形参a和n,局部变量i和theSum,常数0,以及指令都需要分配空间,但所需的空间与n值无关,因此Ssum(n)= 0;

代码2:
int rSum(int a[], int n){//返回数组元素的和    if(n > 0)        return rSum(a, n-1) + a[n-1];    return 0;
         对于代码段2的函数rSum,其嵌套调用层次为:rSum(a,n), rSum(a,n-1), rSum(a,n-2),...,rSum(a,0),递归栈空间包含形参a和n以及返回地址的空间,对于a, 每次需要保留一个指针(4字节),对于n则需保留一个int类型的值(4字节),若假定返回地址也为4字节,那么一次递归调用需要12个字节的栈空间,递归深度为n+1,所以递归栈空间需要12(n+1)字节,因此,S=12(n+1)。当n逐渐增大,空间复杂度的极限形式称为“渐近空间复杂度”,此时为O(n)。


       2、时间复杂度—— 即运行程序所需要的时间

         一个程序P所需要的时间是编译时间和运行时间之和,编译时间与实例特征无关,且一个编译过的程序可以若干次运行而不需要再重新编译,因此我们主要关注程序的运行时间。

         由于计算机未必顺序地执行算数操作,例如计算机可以同时进行一个整数操作和一个浮点型操作,用分析方法确定一个程序的运行时间很复杂,因此只能估算时间,一种估算方法是选择一种或多种关键操作,例如加、减、乘、除、比较等,然后确定每一种操作的执行次数。
代码段3:
int y=1;int>>n;for (int i = 1; i <= n; i++){     y=y*i;}
        代码段3中,其时间复杂度可以根据for循环内的比较次数和加法乘法次数计算,比较次数为n,加法次数为n, 乘法次数也为n。
        那时间复杂度到底为多少呢,当n逐渐增大,时间复杂度的极限形式称为“渐近时间复杂度”,上述代码中的步数为3n,时间复杂度为O(n),值得注意的是步数n3+n2与n3+n2+n的渐近时间复杂度是相同的,都为O(n3)
       
       常出现的有:1 < log n < n < nlogn< n2<n3<2n<n!  (其中<表示渐近小于)。
       
       最好时间复杂度、最坏时间复杂度:
 代码段4:       
void insert(int a[], int& n, const int& x){//把x插入有序数组a[0:n-1]//假设数组a的容量大于n     int i;     for (i =n-1; i>=0 && x < a[i]; i--)           a[i+1]=a[i];     a[i+1] = x;     n++;}
     代码段4为在一个有序数组中插入一个元素,最少的比较次数为1,最多比较次数为n,所以其最好时间复杂度为O(1),最差时间复杂度为O(n)。
   
      运算法则:

        同实例特征加法法则:若T1(n)=O(f(n))   和   T2(n)=O(g(n)),     则 T1(n)+T2(n)=O(max(f(n), g(n)))

        实例特征不同时加法法则:若T1(m)=O(f(m)), T2(n)=O(g(n)),    则 T1(m)+T2(n)=O(f(m) + g(n)) 

       同实例特征乘法法则:    若 T1(n)=O(f(n)) 和 T2(n)=O(g(n)),     则 T1*T2=O(f(n)*g(n))

 

          

           
      
原创粉丝点击