算法分析
算法的复杂性体现在时间复杂性和空间复杂性上.一般使用渐进分析法来表达和计算一个算法的复杂性.
渐进分析法
一般表示输入规模与时间关系的函数比较复杂.渐进分析法计算时间时通常只考虑显著改变函数量级的部分,其余部分忽略.
渐进分析法是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。
渐进分析法包含三种表示方法:大O表示法,Ω(欧米伽)表示法,Θ(西塔)表示法
大O表示法
对于f(n),存在正数n0、c,使得当 n>n0 时,始终存在 0 <= f(n) < =c*g(n),则我们可以用 f(n)=o(g(n))表示。
算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。
大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。
大O表示法表示时间复杂度的最小上限.
1 | for(i=1;i<=n;i++) //循环了n*n次,当然是O(n^2) |
Ω(欧米伽)表示法
对于f(n),存在正数n0、c,使得当 n>=n0 时,始终存在 0 <= c*g(n) <= f(n),则我们可以用 f(n)=Ω(g(n))表示。
对于插入排序在最好的情况下它的时间复杂度为Ω(n)
Ω(欧米伽)表示法表示时间复杂度的最大下限.
Θ(西塔)表示法
Θ(西塔)表示法表示了函数增长的上限和下限.
对于f(n),存在正数c1,c2,使得当 n>=N 时,始终存在 c*g(n) <= f(n)< =c*g(n),则我们可以用 f(n)=Θ(g(n))表示。
数据结构的选择和评价
利用计算机求解一个问题,关键就是确定问题模型所采用的数据结构.
- 仔细分析所要解决的问题,特别是求解问题所涉及的数据类型和数据之间的逻辑关系.
- 在算法设计之前要先进行数据结构的初步设计.
- 注意数据结构的可扩展性,包括考虑当输入数据的规模发生变化时,数据结构能否适应.同时,数据结构应该适应求解问题的演变和扩展.
- 数据结构的设计也要考虑算法的时空开销.