带你了解不一样的时间复杂度和空间复杂度 原创

努力的IT小胖子
发布于 2022-1-17 13:45
浏览
1收藏

春节不停更,此文正在参加「星光计划-春节更帖活动

带你了解不一样的时间复杂度和空间复杂度

前言

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。因为算法的有穷性,算法运行消耗的时间不可能是无限的。而对于一个问题的处理,可能有多个不同的算法来解决这一个问题,而不同的算法运行消耗的时间一般是不一样的,同时算法在运行的过程中占用的空间资源也是不一样的。

从时间和空间考虑,可以对算法的性能进行考察。在著名的书籍算法导论中,用时间复杂度和空间复杂度从两个维度来衡量算法的性能。

时间复杂度

时间复杂度(Time Complexity)就是表示一个算法运行所耗费的时间,从理论上是算不出来具体的算法执行所消耗的时间,只能通过代码运行测试才能知道具体的算法执行所消耗的时间。但是我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或「时间频度」。记为T(n)。

一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做:T(n)=Ο(f(n))。问题的规模n越大,算法执行的时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

时间复杂度的计算

如果想衡量代码的“工作量”,那么就需要将代码拆解成计算机能一条条能识别和执行的基本命令。这样代码的在执行时间就可以用数量来表示。

在真实的计算机系统里,基本命令包含:算术指令(加减乘除、取余、向上向下取整)、移动指令(装载、存储、赋值)、控制指令(条件或无条件跳转,子程序调用和返回)。那么下面通过几个例子来分析一下每个例子的时间复杂度。

示例一

int a = 1;

简单赋值操作,运行时间1(1个单位)

示例二

if(a>1){
}

简单判断操作、条件跳转,运行时间

示例三

for (int i = 0; i < N; i++) {
    System.out.println(i); 
}

有循环,运行时间1(i赋初值)+ N+1(判断)+N(打印)+N(i自增)= 3N + 2

空间复杂度

算法的空间复杂度,是指算法需要消耗的内存空间。有时候做递归调用,还需要考虑调用栈所占用的空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。所以,我们一般对程序复杂度的分析,重点都会放在时间复杂度上。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 10:42:39修改
收藏 1
回复
举报
回复
    相关推荐