时间复杂度与空间复杂度详解

时间复杂度与空间复杂度

算法复杂度分为时间复杂度空间复杂度
时间复杂度是指执行算法所需要的计算工作量;空间复杂度是指执行这个算法所需要的内存空间。

1.时间复杂度

算法的时间复杂度是一个函数,它定性描述一个算法的运行时间。
一个算法的执行所需要的时间,从理论上来说是算不出来的,必须通过上机测试才能得到,但这并不是说我们对于每个算法都要上机测试,我们只需要知道哪个算法所花的时间多,哪个算法所花的时间少就行。
一个算法花费的时间与算法中的语句执行次数成正比,算法中的语句执行次数越多,它花费的时间就越多。一个算法中的语句执行次数成为语句频度时间频度,记为T(n),n为问题的规模。

有了算法执行次数的函数T(n),是否就可以分析和比较两个算法的运行时间了呢?答案是不一定的。
例如算法A的函数T(n)=50n,算法B的函数T(n)=3n^2,这两个算法到底谁的运行时间更长呢?这取决于n的取值。
当n不断变化时,时间频度T(n)也会不断变化,但有时我们想知道它变化的规律,这时候就有了渐进时间复杂度的概念,官方定义如下:
若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。
记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
渐进时间复杂度用大写O来表示,所以也被称为大O表示法。

如何推导出时间复杂度呢?有如下几个原则:
1.如果运行时间是常数量级,用常数1表示;
2.只保留时间函数中的最高阶项;
3.如果最高阶项存在,则省去最高阶项前面的系数。
下面举几个例子:
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
时间复杂度的计算:
1.对于一个循环,假设循环体的时间复杂度为O(n),循环次数为m,则整个循环的时间复杂度为O(n×m)。
在这里插入图片描述
此时时间复杂度为O(n×1),即O(n)。

2.对于多个循环,假设循环体的时间复杂度为O(n),各个循环的循环次数为别为a,b,c,则整个循环的时间复杂度为O(n×a×b×c)。
在这里插入图片描述
此时时间复杂度为O(n×n×1),即O(n^2)。
在这里插入图片描述
这个循环的时间复杂度的计算稍微复杂一点。
当i=0时,内循环执行n次运算,当i=1时,内循环执行n-1次运算…当i=n-1时,内循环执行1次。
所以,执行次数T(n)=n+(n-1)+(n-2)+…+1=n(n+1)/2=n^2 / 2 + n / 2。
根据上文的大O表示法可知,此时时间复杂度为O(n^2)。

3.对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。
在这里插入图片描述
此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

一般情况下,我们所讨论的时间复杂度算法指的是算法的最坏情况复杂度,它是在任何输入实例上运行时间的上界。另一种讨论的情况是平均情况复杂度,它是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间,一般是特别指明才会使用它。

2.空间复杂度

一个程序的空间复杂度是指运行完一个程序所需内存的大小。
利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。
一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。
程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。
主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。
这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。
这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。

第一次写博客,如有问题欢迎指出~

猜你喜欢

转载自blog.csdn.net/qq_44874062/article/details/107932891