我们都知道一个问题有多种算法,而算法分析就是选择合适的算法和改进的算法。而一个算法的优劣性是从时间复杂度和空间复杂度来进行评判。那么接下来我们就来玩转时间,空间复杂度。
一、时间复杂度
1、虽然叫时间复杂度但是不是计算时间的,因为你想如果我们要算出一个算法的实际运行时间,那岂不是要将它上机测试运行,每一个都要这样做就会很麻烦,并且我们有的可能还比较抽象,很难计算出来,任务量大,很花费时间。因此我们用算法中语句执行的次数来衡量它。
再啰嗦点:
1)一个算法所耗费的时间=算法中每条语句的执行时间之和
2)每条语句的执行时间=语句的执行次数(即频度(Frequency Count))×语句执行一次所需时间
3)算法转换为程序后,每条语句执行一次所需的时间取决于机器的指令性能、速度以及编译所产生的代码质量等难以确定的因素。
4)若要独立于机器的软、硬件系统来分析算法的时间耗费,则设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和。
实际上也可以这么说,时间复杂度就是函数,而这个函数不是我们语言中的函数,而是数学中的函数,这个函数计算的就是运行次数。
穿插两个小概念:
1)算法分析
1. 最坏情况:任意输入规模的最大运行时间。(上界)
2.平均情况:任意输入规模的期望运行时间。
3.最好情况:任意输入规模的最小运行时间,通常最好情况不会出现。(下界)
例如:在一个长度为N的线性表中搜索一个数据x。
最坏情况:N次比较。
平均情况:N/2次比较。
最好情况:1次比较。
在实际中我们通常情况考量的是算法的最坏运行情况。也就是说对于任意输入规模N,算法的最长运行时间,理由如下:
1. 一个算法的最坏情况的运行时间是在任意输入下的运行时间上界。
2. 对于某些算法,最坏的情况出现的较为频繁。
2)O的渐进表示法