时间复杂度和空间复杂度
什么是时间复杂度
了解时间复杂度之前,先了解时间频度
时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
一句话:T(n)就是时间频度,表示算法执行的次数
问题:T(n)随着n的改变而改变
时间复杂度
时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
时间复杂度怎么算
基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。
1、计算出每条语句执行次数T(n)
求出代码中每条语句执行的次数
在做算法分析时,一般默认为考虑最坏的情况。
2、计算出T(n)的数量级
求T(n)的数量级,只要将T(n)进行如下一些操作:
忽略常量
低次幂和最高次幂的系数
令f(n)=T(n)的数量级。
3、用大O来表示时间复杂度
当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。
只保留最高阶项,最高阶项存在且不是1,则去除与这个项相乘的常数。
前面提到的时间频度T(n)中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律,为此我们引入时间复杂度的概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称时间复杂度。
T(n)/f(n)的极限值为不等于零的常数什么意思?
首先你要知道T(n)是f(n)忽略常量、低次幂和最高次幂的系数。只保留能代表数量级的项。
所以T(n)肯定是小于等于f(n)的
那么,如果T(n)/f(n)的极限值等于0,那么就是说f(n)的增长趋势比T(n)大太多,那么就说明他们俩不是一个数量级的。
不是一个数量级什么意思呢?
就好比你玩LOL,你是黄铜1,他是黄铜3,虽然你比他高一点,但你们俩还是黄铜,是一个数量级的。。。大多数时候,通过段位就能判断你的水平,不会在意是你在你段位是1还是5。这里算法的时间复杂度也是一样,只保留核心项,其他的都去掉。
什么时候不是一个数量级呢?等你上白银或者黄金的时候,那就不是一个数量级的。。。
一个算法的执行时间与哪些因素有关
衡量一个算法的好坏不能简单的从这个算法所花费的时间来衡量。因为这个时间受多种因素影响。一般来说一个算法花费的时间有以下4点
计算机执行的速度->硬件层面
编译产生的代码质量->软件层面
算法的好坏(算法使用的策略)
问题规模
在给定软硬件环境下,其实就是你在自己电脑上写算法的时候,算法执行时间只受算法本身的好坏和要处理的问题的规模影响。这样就将4个影响因素减少为2个,简化了问题。
我们继续分析,
给定问题规模n之后,优秀的算法可能执行几次就搞定了,一般的算法可能执行很多很多次才搞定;
当给定算法时,问题规模n很小时,可能执行几次就搞定,而n很大时,就得执行很多次了。
所以算法优劣和问题规模n改变时,执行次数(基本操作数)将改变,所以执行次数就是算法优劣和问题规模n的函数。
既然执行时间受算法好坏和问题规模n的影响,那么执行时间就是它俩的函数。
推导大O阶有一下三种规则:
用常数1取代运行时间中的所有加法常数
只保留最高阶项
去除最高阶的常数
一般我们我们评估一个算法都是直接评估它的最坏的复杂度。
时间复杂度是一个量级的概念,而不是具体的值,比如O(5n)的量级是n,因为这个时间复杂度函数内最高量级是变量n的一次方
例子

根据推导大O阶方法:
1、上面运行的次数3,用常量1表示。
2、没有最高阶
例子

在这段程序中,会运行n/2次。
根据推导大O阶方法:
1、上面运行的次数n/2,不是常量。
2、最高阶,X=log2n。
再如下面平方阶的例子

一共循环 n x n 次
根据推导大O阶方法:
1、上面运行的次数n x n,不是常量。
2、最高阶,X=n2。
再看例子

根据推导大O阶方法:
这里要看我最后一个红框内容,他用到了推导方法中的第三点,如果最高阶项存在的不是1,则去除与这个项相乘的参数。
所以最终大O阶为:O(n2)
常见时间复杂度:

原文:https://blog.csdn.net/CrankZ/article/details/84726408
原文:https://blog.csdn.net/cyuyanenen/article/details/51514443

浙公网安备 33010602011771号