严蔚敏视频 笔记02
算法必须满足5个特性:
1.有穷性 有穷步骤 有限时间
2.确定性 只有一条执行路径
3.可行性 可以通过已经实现的基本操作运算的有限次实现
4.有输入 中断输入或嵌入算法当中
5.有输出 是信息加工得到的结果 是算法的功能
设计原则:
1.正确性 满足特定需求
对正确的理解:
a.不含语法错误
b.对于几组输入数据能够得出满足要求的结果
c.对于精心选择的、典型、苛刻带刁难性的输入数据能够得出满足要求的结果
d.对一切合法的输入数据都能得出满足要求的结果
2.可读性 便于阅读
3.健壮性 输入非法时应进行相应处理 处理出错的方法应返回一个出错的值而不是简单中断程序
4.高效率与低存储量需求
算法效率的衡量方法和准则
1.事后统计法
缺点:
必须执行程序
其他因素掩盖算法本质
2.事前分析估算
和算法执行时间相关的因素:
1.所选策略
2.问题规模
3.编写程序的语言
4.编译程序产生的及其代码的质量
5.计算机执行指令的速度
前两条与软件有关
随着问题规模n的增长,算法执行时间增长率和f(n)的增长率相同:
T(n)=O(f(n))
T(n)为算法的时间复杂度
如何估算算法的时间复杂度
算法 = 控制结构 + 原操作(固有数据类型的操作)
算法执行时间=∑原操作(i)的执行次数*原操作(i)的执行时间
算法执行时间与原操作执行次数之和成正比
某基本操作在算法中执行的次数
例一
for(i=1;i<=n;++i)
for(j=1;j<=n;++j) {
c[i,j]=0;
for(k=1;k<=n;++k)
c[i,j]+=a[i,k]+b[k,j];
}
基本操作:乘法操作
时间复杂度:O(n^3)
例二
void select_sort(int a[],int n) {
for(i=0;i<n-1;++i) {
j=i;
for(k=i+1;k<n;++k)
if(a[k]<a[j]) j=k;
if(j!=i) a[j] 和 a[i]交换;
}
}
基本操作:比较数据元素
时间复杂度:O(n^2)
语句的出现次数——语句的频度
最深层频度的函数
以上两例效率和输入数据无关,只和规模有关
例三
void bubble_sort(int a[],int n) {
for(i=n-1,change=TRUE;i>1&&change;--i) {
change=FALSE;
for(j=0;j<i;++j)
if(a[j]>a[j+1]) {
a[j] 和 a[j+1]交换;
change=TRUE;
}
}
}
基本操作:赋值操作(交换)
时间复杂度:O(n^2) 以最坏情况来计算
平均时间复杂度 要统计概率
算法的存储空间需求
算法的空间复杂度:
S(n)=O(g(n))
随着问题规模n的增大,算法运行所需存储量与g(n)的增长率相同
存储量包括:
1.输入数据所占空间
2.程序本身所占空间
3.辅助变量所占空间
若额外空间相对于输入数据量来说是常量,称为原地工作
所需存储量依赖输入,按最坏考虑
本章小结:
1.熟悉名词、术语的含义,掌握基本概念
2.理解算法5个要素的确切含义
3.掌握计算语句频度和估算算法时间复杂度的方法