首先我们来了解一下程序的定义
程序的定义: 程序=数据结构+算法
程序是为解决实际问题而存在的,而解决问题,当然要使用到数据结构以及数据结构的算法。
比如:腾讯QQ,腾讯QQ上经常会有显示可能认识的好友,这种就是使用到了图这中数据结构(最短路径),但是光有数据结构还不行,要实现这种功能还需要在图结构的基础萨汗设计出一种算法。算法就是特定问题求解步骤的描述。
数据结构的定义:
一般情况下,用计算机解决一个具体问题是,首先要从具体问题抽象出一个适当的数学模型(数据结构),然后设计一个解决此数学模型的算法。
数据结构:首先要研究对象的数据元素之间的关系,平时所说的数据结构是一种逻辑结构,而在程序运行时必须把这些逻辑结构转为物理结构。
常见逻辑结构数据:集合结构(两个函数中分别定义的局部变量,两这没有关系,就好比数学里的相离),线性结构,树形结构,图形结构。
物理结构:顺序存储,链式存储。
数据元素:组成数据的基本单位。
数据项:一个数据元素由若干数据项组成。
数据对象:性质相同的数据元素的集合。
算法的定义:
算法是1特定问题求解1步骤的描述。
算法是独立存在的一种解决问题的方法和思想。
成为一个算法需要满足的条件:
算法必须满足的条件:
- 输入:算法具有0个或者多个输入;
- 至少有1个或者多个输出;
- 有穷行:算法在执行有限的步骤之后会自动结束而不会进行死循环状态;
- 确定性:算法中的每一步都有意义,不会出现二义性;
- 可行性:算法中的每一步都必须可行;
判断一个算法的好坏:
- 正确性:对于合法输入能够得到满足的结果,算法能够处理非法处理,并得到合理结果;
算法对于边界数据和压力数据都能够得到满足的结果;
- 可读性:算法要方便阅读,理解和交流;
- 健壮性:算法不应该产生莫名其妙的结果,一会正确,一会又是其它结果;
- 高性价比:利用最少时间和资源得到满足要求的结果,可以通过时间复杂度和空间复杂度来判定;
时间复杂度与空间复杂度:
一般判定一种算法的效率可以采用事后统计法和事前分析法估算;
事后统计法缺点:
必须编写相应的测试程序,严重依赖硬件和运行时的环境,算法的数据采集相当的困难。
事前分析估算:
主要取决于问题的规模。
1、时间复杂度
公式: T(n) = O( f(n) ); 其中f(n)是问题规模n的函数,也就是执行某个操作的次数。
在没有特殊说明的情况下,我们所分析的时间复杂度都是指最坏的时间复杂度
常见时间复杂度:
执行次数函数 | 阶 | 非正式术语 |
12 | O(1) | 常数阶 |
2n+2 | O(n) | 线性阶 |
2n2+2n+3 | O(n2) | 平方阶 |
2log2n+2 | O(logn) | 对数阶 |
2n+2nlog2n+2 | O(nlogn) | nlogn阶 |
2n3+2n | O(n3) | 立方阶 |
2n | O(2n) | 指数阶 |
此外还有O(n!)等
各个时间复杂度的关系:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
2、空间复杂度
公式: S(n) = O( f(n) ) 其中f(n)是在问题规模为n时所占用的内存空间大小;
大O表示法同样也适合空间复杂度,这里就不在重复说明了。
3.时间复杂度与空间复杂度的策略
多算情况下,算法的执行时所用的时间更令人关注;
如果有必要,可以增加空间复杂度来降低时间复杂度;
同理,也可以添加时间复杂度来降低空间复杂度,例如像51单片机,嵌入式设备,内存资源是很珍贵的,就可以通过增加时间复杂度来降低空间复杂度;
因此,我们在实现算法的时候,需要分析具体问题对执行时间和空间的要求;