本篇接着上一篇“算法与算法设计”讲,欢迎回来!!!本篇一起学习算法的时空复杂度!!!
《数据结构》算法与算法设计http://t.csdn.cn/5o6qC
第一次看的小伙伴,建议先看看上一篇文章,点击上面链接即可进入!忘记内容了的小伙伴也建议回去看看!!!
本章学习目录:
目录
一、算法分析的内容
我们写的一个算法,要知道它是否性能良好时,那么我们就需要对它进行分析。
问题来了,我们该分析它什么?
我告诉你了,我们关键要分析的是算法占用的资源!!!
什么资源?:(主要是两个)
- CPU时间:时间性能分析
- 内存空间:空间性能分析
对应的就是我们的两个复杂度:时间、空间
二、分析方法
我们分析算法目的是为了改进算法的性能。
空间复杂度很多时候都是O(1),在这里我们重点讨论的是时间的复杂度!!!
有两种分析方法:事后分析统计法和事前估算统计法
- 事后分析统计法
编写相应的程序,然后统计其执行的时间。
缺点:
这种方法虽然是可行的,但面对很多时候,也那么适合使用!
主要有以下原因:导致不能用绝对的执行时间来比较
- 编写算法的语言(Java、c\c++等等)
- 执行程序的环境(不同的计算机、不同的状态等等)
- 其他因素
2、事前估算统计法
撇开上述因素,认为算法的执行时间与问题的规模n的函数。
三、算法的执行时间
首先我们要知道,
算法=控制结构+原操作
算法的性能好坏正是这两者的综合的效果!
控制结构:包括
- 顺序结构
- 分支结构
- 循环结构
原操作定义:固有的数据类型的操作,如+、-、*、/等等。
在一个算法中,执行原操作的次数越少,其执行时间也就越少,否则越多。
算法频度:算法中原操作的执行次数
而执行时间可以由算法频度来计量!!!
四、计算算法频度T(n)
算法的执行时间=原操作所需时间*T(n)
执行时间T(n)是问题规模n的某个函数f(n),记作:
T(n)=O(f(n))
由上图可知,常见的时间复杂度有:
O(1):常数阶 O(n):线性阶 O(n2):平方阶 O(n3):立方阶 O(log2n):对数阶
.........
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<.......
好啦本篇就学习到这,下一篇内容将学习如何简单快速的计算算法的时间复杂度,这将会抓住“原操作”来讲!!!期待你的关注!