【数据结构】时间复杂度和空间复杂度

2024-01-22 21:51:02 浏览数 (1)

前言:为什么要了解时间空间复杂度

众所周知,在数学领域算法是用于解决某一类问题的的公式和思想。百度百科是这样说的,算法(algorithm),在数学(算学)和计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法,这里有两个重要的结论。1.算法有简单的,也有复杂的。2.算法有高效的,也有拙劣的。

那么如何评定一个算法的优劣呢?

衡量算法的好坏有许多标准,其中最重要的两大指标就是时间复杂度和空间复杂度。

一.时间复杂度

1.1什么是时间复杂度

简单来说时间复杂度就是一个代码运行所需要的时长。但是在没有运行的时候,如何预知其运行时间?事实上由于运行环境和输入规模的影响,代码的绝对运行时间是无法估计的。但是我们可以估计代码基本操作执行次数T(n)(n为输入规模)。

1.2渐近时间复杂度

虽然有了T(n)但是对于时间的分析任然与n有着很大关系,所以我们引入渐近时间复杂度,官方的定义是:若存在函数f(n),使得当n趋近于无穷大的时候,T(n)/t(n)的极限值为不等与0的常数,则称T(n)是t(n)同数量级函数。记作T(n)=O(t(n)),O为算法的渐近时间复杂度,简称为时间复杂度。这种方法也叫大O渐进表示法

直白的说就是把T(n)简化为一个数量级,可以是1, n, n^2.

原则:

  • 如果运行时间是常数级,则用常数1来表示
  • 只保留时间函数中的最高项
  • 如果最高项存在,则省去其前面的系数

1.3时间复杂度的计算方式

一、得出运行时间的函数 二、对函数进行简化

①用常数1来取代运行时间中所有加法常数

②修改后的函数中,只保留最高阶项 ③如果最高阶项存在且不是1,则忽略这个项的系数

这里要注意的是在时间复杂的计算上我们通常按照最坏情况去估算,并且有几层循环并不决定时间复杂度的大小而是要看具体的逻辑。

二.空间复杂度

2.1什么是空间复杂度、

简单来说,空间复杂度是执行算法的空间成本。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。

空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因

此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

2.2空间复杂度的计算

对于空间复杂度的计算我们通常分为四种情况

1常量空间

当算法的储存空间大小固定,和输入规模没有直接关系的时候,空间复杂度记作O(1)

代码语言:javascript复制
int fun1(int n)
{
    int val=3
   ……
}

2.线性空间

算法分配空间是一个线性的集合(如:数组);并且集合的大小和输入规模n成正比时,空间复杂度记作O(n)

3.二维空间

算法分配空间是一个二维数组的集合;并且集合的长度和宽度都输入规模n成正比时,空间复杂度记作O(n^2)

4.递归空间

我们都知道函数的调用需要调用栈上的空间包括进栈和出栈 ,而递归则是在上一层函数的栈空间还未归还就再次开辟新的栈空间。纯粹的递归的操作空间也是线性的如果递归的深度是那么空间复杂度就是O(n).

三.时间与空间的取舍

时间复杂度和空间复杂度的研究是应为计算机的资源是有限的,而在绝大情况下时间复杂度的考虑优先于空间复杂度。是想在日常生活中我们经常会说手机好卡,这便是说他的运行速度慢,即时间复杂度比较大。

0 人点赞