时间复杂度与空间复杂度小结

算法复杂度

算法复杂度又分时间复杂度和空间复杂度。
作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

一.时间复杂度

1.(1)时间复杂度:衡量算法快慢的标准刻度。

(2)虽然是时间复杂度,但是无法直接根据时间来判断算法的快慢,因为根据时间判断会有各种因素的干扰。

(3)所需前提:在cpu单位时间运行指令数恒定的情况下,
(算法运行的基本指令个数)
求算法运行指令数和数据规模n的关系 F(n)。

(4)时间复杂度不是绝对意义上的快慢。
随着数据规模的变化,运行时间的变化趋势
(5)常见时间复杂度的比较
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

**2.**计算时间复杂度的具体步骤如下:

(1)确定算法中的基本操作以及问题的规模
(2)根据基本操作执行情况计算出规模数n的函数f(n),并确定时间复杂度T(n)=O(f(n)中增长最快项/此项系数)(也就是说只考虑最高项,且忽略最高项的系数)
注意:有的算法中基本操作的执行次数不仅跟初始输入的数据规模有关,还和数据本身有关。比如说,一些个排序算法,同样有n个待处理的数据,但数据初始有序性不同,则基本操作的执行次数也不同。一般是依照使得基本操作执行次数最多的输入来计算时间复杂度,即最坏的情况下作为时间复杂度的度量。

例1.1求以下算法的时间复杂度

void fun(int n)
{
    int i = 1,j = 100;
    while(i < n)
    {
        ++j;
        i+=2;
    }
}

分析:

第一步:找出基本操作,确定规模n

1.找基本操作。多数情况下取最深层循环内的语句所描述的操作作为基本操作,显然题目中*++j;i+=2;*这两句都是基本操作。
2.确定规模n。由循环条件可以得知,循环执行的次数和n有关,故,参数n就是我们所说的规模n。
第二步:计算出n的函数f(n)

​ n确定之后,循环的结束与否跟i有关,i的初值为1,每次自增为2,假设i自增m次后,循环结束,则i最后的值为1+2m,因此1+2m>n,即1+2m+K=n(k为常数,弥补循环结束时i和n的差距),解的m=(n-1-K)/2,即f(n)=(n-1-K)/2,根据时间复杂度的计算原则:只考虑最高项,且忽略最高项的系数,所以时间复杂度***f(n)=O(n)***。

例1.2分析以下代码的时间复杂度

void fun(int n)
{
    int i,j,x=0;
    for(i=0;i<n;++i)
        for(j=i+1;j<n,++j)
            ++x;
}

分析:
++x;处于最内层循环,故,++x为基本操作,显然,n为规模,可以算出++x执行次数f(n)=n*(n-1)/2,所以时间复杂度*f(n)=O(n2)

二.空间复杂度

**空间复杂度(Space Complexity)***是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
2.类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
3.大O渐进表示法:
数据规模是n得情况下:
(1)额外使用的空间大小(不考虑输入/输出中用到的空间)
(2)常见形式:
i:int[] array = new array[];
ii: 递归函数

举例1:

// 计算冒泡排序的空间复杂度
void bubbleSort(int[] array){
     for(int i = 0 ; i < array.length-1; i++){
      boolean sorted = true;
        for(int j = 0 ; j <= arrary.length-2-i; j++){
           if(array[j] > array[j+1]{
             int t = array[j];
             array[j] = array[j+1];
             array[j+1] = t;
             sorted = false;
         }
       }
       if(sorted == true){
         break;
       }
     }
   }
}

使用了常数个额外空间,所以空间复杂度为 O(1)

以上为我对时间复杂度和空间复杂度的总结,希望大家提出宝贵意见,第一次写博客,需要大量吸取经验

猜你喜欢

转载自blog.csdn.net/qq_47029734/article/details/107974693
今日推荐