时空复杂度

时空复杂度

算法效率:

  • 时间效率:程序在计算机上执行所消耗的时间

    • 事后统计

      • 缺:编写程序实现算法要花费较多时间精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法分身的优劣
    • 事前分析:估算;算法运行时间=一个简单操作所需的时间*简单操作次数(转化为语句频度的比较

      例:

    1 for(i=1;i<=n;i++)  		 				     // n+1次,虽然不满足条件但也执行一次
    2 	for(j=1;j<=n;j++){ 		 				    // n(n+1)次
    3 		c[i][j]=0;			 		           //n*n次
    4		for(k=0;k<n;k++)					  //n*n*(n+1)次
    5			c[i][j]=c[i][j]+a[i][k]*b[k][j];		 // n*n*n次
    6	}
  • T(n)=2n^3+ 3n^2+2n +1=时间复杂度O(n^3)(为了便于比较仅比较数量级

    T(n)=O(f(n));O(f(n))(O是数量级的符号)为算法的渐进时间复杂度, 简称时间复杂度

    步骤:

    1. 找出语句频度最大的那条语句作为基本语句
    2. 计算基本语句的频度得到问题规模n的某个函数f(n)
    3. 取其数量级将用O表示

    例:

    for( i=1; i<=n; i++)
    ​ for (j=1; j<=i; j++)
    ​ for (k=1; k<=j; k++)
    ​ x=x+1;

    语句频度=n(n+1)(n+2)/6image

    T(n)=O(n^3)

    例:

    i=1;

    while(i<=n)

    ​ i=i*2;

    T(n)=O(log2 n)

    有的情况下基本重复执行次数还随问题的输入数据不同而不同

    例:顺序查找,在数组a[i]中查找值为e的元素,返回其所在位置

    最好的情况:1次;最差的情况:n次;平均时间复杂度:O(n)

    所以,一般考虑的是最差情况下的时间复杂度,以保证算法的运行时间不会更长

    复杂度低->高

    常数阶 对数阶 线性阶 线性对数阶 平方阶 立方阶 ... K次方阶 指数阶
    O(1) O(log2 n) O(n) O(nlog2 n) O(n^2) O(n^3) O(n^K) O(2^n)

  • 空间效率:算法所需存储空间的度量 S(n)=O(f(n))

    算法占据的空间:

    • 算法本身要占据的空间:输入/输出、指令、常数、变量等
    • 算法要使用的辅助空间

    例:将一维数组a中的n个数逆序存放到原数组中

    for(i=0;i<n/2;i++){
    t=a[i];

    ​ a[i]=a[n-i-1];

    ​ a[n-i-1]=t;

    }

    变量为t,其空间复杂度S(n)=O(1)

    for(i=o;i<n;i++)

    b[i]=a[n-i-1];

    ​ for(i=0;i<n;i++)
    ​ a[i]=b[i];
    变量为b[i],其空间复杂度S(n)=O(n)

时间效率空间效率有时候是矛盾的

程序是用某种程序设计语言对算法的具体实现

posted @ 2023-01-30 14:58  原语  阅读(48)  评论(0)    收藏  举报