算法与算法分析
算法
定义
对特定问题解决方法和步骤的一种描述,指令的有限序列。
描述
-
自然语言
-
流程图
-
-
伪代码,类语言
-
程序语言(一个问题可以有多种算法–考虑如何将输入转化成输出–程序使某种程序设计语言对算法的基本实现–程序=数据结构+算法)
特性
- 有穷性
- 确定性
- 可行性
- 输入(0或多个)
- 输出(1或多个)
设计要求
- 正确性
- 可读性
- 健壮性(鲁棒)
- 高效性
算法分析
算法的效率
- 时间效率
- 空间效率
上述可能使冲突
时间效率
- 定义:程序在计算机执行消耗的时间
- 度量方法:
- 事后统计
算法实现,测试时间和空间开销 - 事前分析
估算
- 事后统计
算法运算时间=一个简单操作(幅值,比较,移动等)所需要的时间*简单操作次数
矩阵乘法:
int n = 4;
int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int b[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int c[4][4];
int i,j,k;
for (i=1;i<=n;i++){ // 执行(n+1)次,最后一次会执行判断
// 接下来的代码块会执行n次
for(j=1;j<=n;j++){ // 执行n(n+1)次,最后一次会执行判断
c[i][j]=0; // 执行n*n次
for (k=0;k<n;k++){ // 执行n*n(n+1)次,最后一次会执行判断
c[i][j]=c[i][j]+a[i][k]*b[k][j]; // 执行n*n*n次
}
}
}
将所有执行时间相加得到时间消耗T(n)
简化:仅比较数量级–时间复杂度
上述求解矩阵乘法时间复杂度
n越大执行时间越长
基本方法
定理1:
时间复杂度是由嵌套最深语句的频度决定的
举例:
时间复杂度基本概念
最坏时间复杂度
平均时间复杂度
最好时间复杂度
对于复杂时间复杂度:
分解再根据大O加法乘法法则计算
时间复杂度比较
空间效率
空间复杂度
举例:
总结(week1+week2-1)
设计好算法: