算法是解决特定问题求解步骤的描述,即处理问题的策略
表现为指令的有限序列
每条指令表示一个或多个操作
引入
求解1+2+3+...+100=?
高斯的解法:
程序实现如下:
算法特性
1.零个或多个输入,至少一个输出
2.有穷性 有限步骤,不会出现无限循环
3.确定性 每一个步骤具有确定的含义,不会出现二义性
4.可行性 每一步必须可行,即每一步可以通过执行有限次数完成
算法设计要求
1.正确性 有输入输出、处理无歧义、正确反应问题的需求、得到正确答案
2.可读性
3.健壮性 输入数据不合法时,会做出相关处理
4.时间效率高、存储量低
算法效率的度量方法
1.事后统计【不考虑】
通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序运行时间比较
缺陷:
2.事前分析估算
在程序编制前,依据统计方法对算法进行估算
程序消耗时间取决于:
程序运行时间 ——> 算法好坏 + 问题输入量的规模
看引入中的两种求和算法
第一种:2n+3 次
第二种:3 次
延伸代码:100^2 + 2次
测定运行时间最可靠的方法——> 计算对运行时间有损耗的基本操作的执行次数
运行时间与此计数成正比
函数的渐近增长
算法A要做2n+3次运算【n次循环完后继续n次循环,再有3次赋值或运算】,算法B要作3n+1次运算【同A】,输入规模都是n,谁快?
不一定
即n=1,A<B;n=2,效率相同;n > 2, A > B ——> 总体上,A好过B
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,更应该关注最高价项的价数
算法时间复杂度
用大写O( ) 体现算法时间复杂度的记法,称之为大O记法
O(1) 常数阶
O(n) 线性阶
O(n2) 平方阶
例子:
运行次数函数是f(n)=3
时间复杂度为O(1)
12次
这种与问题大小无关(n的多少),执行时间恒定的算法,称之为具有O(1)的时间复杂度
分析算法复杂度,关键是要分析循环结构的运行情况
线性阶 ——> 循环的时间复杂度为O(n) 因为循环体中的代码要执行n次
对数阶 ——>2x = n ——> x = log 2 n 时间复杂度为O(log n)
平方阶 ——> 时间复杂度为O(n2)
例:
用推导大O阶的方法得其时间复杂度为O(n2)
例:分析方法调用的时间复杂度
调用的函数:
该函数的时间复杂度为O(1),所以整体的时间复杂度为O(n)
如果调用的函数:
则整体的时间复杂度是O(n2)
常见的时间复杂度
最坏情况与平均情况
【很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的】
对算法的分析:
1.平均时间复杂度——>计算所有情况平均值
2.最坏时间复杂度——>计算最坏情况下的时间复杂度
空间复杂度
一般,不用限定词使用“复杂度”时,是指时间复杂度