由于这是本人的一些学习笔记,什么算法历史等在这里不作概述。
1.1概念
算法是规则的有限集,是为解决特定问题而规定的一系列操作。
1.1.1算法的特性
有限性:有限步之后必须结束。
确定性:每一步骤必须有确切的含义,无二义。
可行性:原则上能精确的运行,即在现有条件情况下,是可以实现的。即使手工运算也能实现。
输入性:有0个或多个输入,刻画运算对象的初始情况。
输出性:有一个或多个输出,反映数据加工结果。
1.1.2算法的描述方式
自然语言
框图(流程图或N-S图)
高级语言
伪代码(类语言)
1.1.3算法设计要求(什么才是“好”算法)
正确
可读性好
健壮性高
高效率-低存储
1.2算法复杂度分析
1.2.1时间复杂度
过于简单的时间复杂度分析这里不予赘述
下面看一个例子:
int i=0,sum=0;
while(sum<n){
i++;
sum+=i;
}
return sum;
假设执行次数为m,即i最后为m
则有sum=m(m-1)/2 即m(m-1)/2>=n
计算得T(n)=O(√n)
时间复杂度的类别:
最好时间复杂度:最少次数
平均时间复杂度:平均次数
最坏时间复杂度:最大次数
一般采用最坏情况来作为算法的时间复杂度
1.2.2空间复杂度
一个算法的存储量包括形参所占空间和临时变量。在对算法进行存储空间分析时,只考虑临时变量所占空间。
两个例子:
void func(int n){
int i=1,k=100;
while(i<=n){
k++;
i+=2;
}
}
空间复杂度:S(n)=O(1)
int maxelem(int a[],int i,int j){
int mid(i+j)/2,max1,max2;
if(i>j){
max1=maxelem(a,i,mid);
max2=maxelem(a.mid+1,j);
return (max1>max2)?max1:max2;
}
else return a[i];
}
递归算法空间复杂度=每层需要的辅助空间*递归深度
S(n)=O(logn)
1.3算法分析的三种渐进符号:O、Ω和θ
1.3.1大O符号
大O符号:f(n)=O(g(n)),当且仅当存在正常量c和n0,使n>=n0时,f(n)<=cg(n),即g(n)为f(n)的上界
大Ω符号与大O符号相反
大θ符号居中
简单来说:
也就是长这个样子
我个人建议通过极限法理解:
与数学结合起来,再联系图像,就会好理解多