什么是时间复杂度、空间复杂度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是时间复杂度、空间复杂度?相关的知识,希望对你有一定的参考价值。
1、时间复杂度是指执行算法所需要的计算工作量。
时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。
2、空间复杂度是指执行这个算法所需要的内存空间。
空间复杂度需要考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。
空间复杂度也就是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。
扩展资料:
时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;相反的当追求一个较好的空间复杂度时,就可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。算法的时间复杂度和空间复杂度合称为算法的复杂度。
参考资料:百度百科-空间复杂度
参考资料:百度百科-时间复杂度
参考技术A1、时间复杂度:是指一个算法中的语句执行次数。
算法分析的目的在于选择合适算法和改进算法。
2、空间复杂度:是对一个算法在运行过程中临时占用存储空间的度量。
一个算法在计算机存储器上所占用的存储空间包括存储算法本身所占用的空间,算数和输入输出所占用的存储空间以及临时占用存储空间三个部分。
扩展资料:
在一个算法中,时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;
反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。
算法的时间复杂度和空间复杂度合称为算法的复杂度
参考资料:百度百科-时间复杂度
百度百科-空间复杂度
参考技术B算法复杂度包括时间复杂度和空间复杂度。
时间复杂度是一个函数,它描述的是运行该算法所需要的时间,即执行该算法所需要的计算工作量。
空间复杂度是指算法在运算的过程中临时占的储存空间的大小,即执行该算法所用的储存空间。
扩展资料:
时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度
参考资料:百度百科--时间复杂度
参考技术C算法复杂度分为时间复杂度和空间复杂度。
时间复杂度是指执行算法所需要的计算工作量。在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。
空间复杂度是指执行这个算法所需要的内存空间。空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
扩展资料
时间复杂度
计算方法
1、一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得T(n)/f(n)的极限值(当n趋近于无穷大时)为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。
2、在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级(它的同数量级有以下:1,log2n,n,n log2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n) = 该数量级,若 T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n))
例:算法:
则有 ,根据上面括号里的同数量级,我们可以确定 n的三次方 为T(n)的同数量级
则有 ,然后根据 T(n)/f(n) 求极限可得到常数c
则该算法的时间复杂度:T(n) = O(n^3) 注:n^3即是n的3次方。
3、在pascal中比较容易理解,容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。
空间复杂度
计算方法
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若一个算法为 递归算法,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表示开始进行的一次非递归调用)。算法的空间复杂度一般也以数量级的形式给出。
参考文件:百度百科 时间复杂度参考文件:百度百科 空间复杂度
时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。
计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
拓展资料
时间空间复杂度
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。算法的时间复杂度和空间复杂度合称为算法的复杂度。
资料来源:百度百科-时间复杂度 百度百科-空间复杂度
浅淡数据结构时间复杂度和空间复杂度
文章目录
前言
初学数据结构一般最早接触到的概念就是时间复杂度和空间复杂度。这两个标准可以用来衡量一个算法的好坏。学会分析某个算法或程序的时间复杂度和空间复杂度是必需掌握的技能。本文将围绕这两个概念进行相关介绍。
1.时间复杂度和空间复杂度的相关介绍
1.为什么要引入时间复杂度和空间复杂度的概念
如何衡量一个算法的好坏呢?是代码越少越好吗?算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。引入这两个概念后可以按照这两个标准分析出某个算法优劣程度。同时还能根据这种标准来优化改进算法。这相当于一种评判标准。这种标准分析起来比较简单也比较公正。不用把代码放在机器上实际评测,同时哪怕同一段代码放在不同效率的机器上跑,执行速度肯定会有所差异。因此就引入了时间复杂度和空间复杂度的概念。
2.什么是时间复杂度和空间复杂度
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
大O符号(Big O notation):是用于描述函数渐进行为的数学符号。 推导大O阶方法:1、用常数1取代运行时间中的所有加法常数。2、在修改后的运行次数函数中,只保留最高阶项。3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
2.具体示例分析
1.大O法只保留高阶项
分析如下代码求出时间复杂度
void Func1(int N)
int count = 0;
for (int i = 0; i < N ; ++ i)
for (int j = 0; j < N ; ++ j)
++count;
for (int k = 0; k < 2 * N ; ++ k)
++count;
int M = 10;
while (M--)
++count;
简单分析可得这个程序执行次数是N * N+2*N+10,这就找到基本语句与问题规模N之间的数学表达式。根据大O法的规则,只保留最高项同时舍去系数,O(N^2),其实我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。随着N的增大,除了N ^2外,其余项对整个结果的影响并不是很大。这段代码的空间复杂度也很好算,除了变量所占据空间外,并没有占据额外的空间,所以空间复杂度就是O(1)。
2.一般情况关注的是算法的最坏运行情况
分析如下代码求出时间空间复杂度
int BinarySearch(int* a, int n, int x)
assert(a);
int begin = 0;
int end = n-1;
while (begin < end)
int mid = begin + ((end-begin)>>1);
if (a[mid] < x)
begin = mid+1;
else if (a[mid] > x)
end = mid;
else
return mid;
return -1;
不难看出上述代码实际上是二分查找。二分查找是不断缩小范围进行查找,二分查找的查找情况会分为最好和最坏的情况。在目标元素存在的前提下,可能一次就找到了。这是最好的情况。当目标元素的位置处于边界位置时或者不存在时,需要多次查找,这是最坏情况下的查找的。那么这个算法的时间复杂度到底怎么算呢?当一个算法分为最好运行情况或者最坏运行情况时,实际中一般情况关注的是算法的最坏运行情况。那么这个算法的时间复杂度应该是多少呢?
假设有序数组长度为N,每次查找都会缩小一半的区间,也就是相当于数组长度缩短了一半查找,直到范围区间缩小至1。这相当于整个数组都查找完毕。如果查找次数为x 那么就有1 * 2 * 2 * 2…=N,也就是2^x=N,那么x=log2N,log以2为底N的对数,但是在算法分析中一般都是写成O(logN) ,和数学上表达是不一样的。这段代码中的空间上的消耗都是常数大小,所以空间复杂度是O(1)。
3.分析递归函数的时间空间复杂度
分析以下代码求出时间空间复杂度
int Fib(int N)
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
不难看出以上的代码是求斐波那且数的递归写法。那么如何分析这段代码的空间复杂度呢?递归时间复杂度是等于递归的次数乘上每次递归调用执行次数。
递归次数的有了,接着分析每次递归执行次数。因为函数体内只用判断一次是否小于3,相当于执行了一次,也就是常数次。由此可得时间复杂度就是O(2^n)。那么空间复杂度如何分析呢?记住一句话空间是可以重复利用的但是时间是不能重复利用的。
虽然递归次数很多但是要计算f(n)势必会计算f(n-1),计算f(n-1)势必会计算f(n-2)依此类推。函数每次调用都会创建见函数栈帧。为f(1)到f(n)创建的函数栈帧是会被重复利用的,直到每次函数调用结束,为之创建的函数栈帧空间也随之销毁。因为这段代码中的递归是有很多次重复调用的,也就是重复多次调用参数相同的函数,很多次递归计算实际上是在同一空间内计算的,递归的时间复杂度实际上看的是递归的深度。从f(n)到f(1)所消耗的空间也就是n,因为每次消耗常数大小的空间,为f(n)到f(1)创建n次空间。所以时间复杂度O(n)。
在分析一段代码求时间空间复杂度
long long Fac(int N)
if(N == 0)
return 1;
return Fac(N-1)*N;
这段代码是用来求n的阶层的递归调用。有了先前的递归分析经验,这样的代码分析起来也是很简单的。先前说了递归调用时间复杂度可以看作是递归次数乘以每次递归函数内部执行次数。因为计算f(n)会调用f(n-1),计算f(n-1)会调用f(n-2),计算f(n-2)会调用f(n-3),依此类推直到调用f(1),从f(1)到f(n)调用了n次,每次调用只判断n是否为1,所以相当于每次调用函数内部执行1次,也就是常数次。所以时间复杂度为O(n)。因为每次调用函数是创建的空间大小常数大小,调用n次函数,也就是创建了n次空间,所以实际上空间复杂度是O(n)。
3.总结
- 1.对于分析时间复杂度的时候不能只是简单的看循环层数,循环一层就是O(n)循环两层就是O(n^2)这种判断方式太武断了。要结合算法的思想一步分析,最后得出结果。二分查找就是一层循环,但是时间复杂度就不是O(n)。
- 2.当某种算法分最坏和最好执行状况时,以最坏的的状况来分析这个算法的时间复杂度。
- 3.学会分析时间空间复杂度,是学习数据结构的重要一步。关于时间复杂度和空间复杂度简单的介绍完毕。以上的内容如有错误,欢迎指正!
以上是关于什么是时间复杂度、空间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章