1、时间复杂度
算法执行时间需要通过依据该算法编制的程序在计算机中运行的时间来衡量,通常有一下两种衡量方式:
(1)事后分析法:即在计算机上运行已编制的程序,观察其执行时间,可精确到毫秒级,可以说是相当精确。但是此法一般很少用,原因有两个,一是使用此方法必须先编制程序,在计算机运行之后才能统计出时间,二是此方法依赖的客观因素很多,如计算机的软硬件环境,程序的编译环境等。
(2)事前分析法:采取事前估算时间的方法来估算时间,程序在计算机上运行的时间一般取决于以下因素:a、依据的算法选用何种策略;b、问题的规模,如n=100与n=1000是不同的;c、程序采用的语言,同一个算法不同语言实现是不同的,语言级别越高,需要的时间就会越多;d、编译程序的环境;e、机器执行指令的速度。
为了便于比较几种不同算法的复杂度,排除一些客观的因素,只从代码上来观察,采取的方法是从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该操作重复执行的次数作为该算法的时间量度。算法的时间量度记作:T(n) = O(f(n));
例:以下程序的时间复杂度为:
{++x; s = 0}; //T(n) = O(1);
for(int i=0; i<n; i++) {++x; s = 0} ; //T(n) = O(n);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++) {++x; s = 0} ; //T(n) = O(n^2);
分析时间复杂度时,不同的输入会有不同的复杂度,不同的参数会有不同的复杂度,一般我们采用平均复杂度,即将最优时间复杂度与最劣时间复杂度取平均值,但是一般分析复杂度的时候,可以直接分析最劣复杂度来进行比较。
2、空间复杂度
算法所需存储空间的量度为空间复杂度,表示如下:S(n) = O(f(n))。
一个上机执行程序除了需要存储空间来寄存本身所用的指令、常数、变量、输入数据等,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。此空间的大小即为算法所占用的空间复杂度。
3、时间复杂度与空间复杂度的关系
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。算法的时间复杂度和空间复杂度合称为算法的复杂度。
03-02
3万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)