定义:
算法:对特定问题求解步骤的一种描述。是指令的有限序列。
特性:
-
有穷性:有限
-
确定性:需求确定、指令确定
-
有效性:指令都是由意义
-
输入:
-
输出:
目标:
-
正确性:基本要求,需求和实现对应。
-
可读性:使程序员能够读懂,编写代码时可以辅助注释。
-
健壮性:临界值的处理、无效数据的校验等。
-
高效性:使用较少的资源(资源分2种:时间资源、空间资源)。一个好的算法要做到执行时所需时间尽量短,所需的最大存储空间尽量少。
分析概述:
-
算法的复杂度是衡量算法优劣的重要依据。
-
算法的复杂度分类:时间复杂度、空间复杂度。
-
时间复杂度:执行时间的长短。
-
空间复杂度:执行时空间需求量,也就是计算机资源的使用量。
-
分析时间复杂度:
1、主要考虑因素:
1、算法本身
2、问题规模
3、程序语言选择
4、编译程序(JDK优势)
5、硬件速度
6、运行软件
时间复杂度通过大O表示法进行表示的
-
大O表示法,用于估算一个算法的执行时间。
-
算法执行时间:Σ(指令的执行次数 * 指令的执行时间)。
-
指令的执行时间
是固定的,可以不考虑。只需要考虑指令的执行次数
即可。 -
大O表达法,通过统计
指令的执行次数
,就可以估算出一个算法的优劣。 -
指令的执行次数
:每行代码执行的次数,将所有的次数累加
在一起即可。 -
例如1.7:2n^3 + 3n^2+2n+1 总次数表达式 --> 只考虑最高次幂 --> O(n^3)
-
大O表达式只需要考虑最高次幂的项。
大O表达式常见的形式
-
常量阶:O(1) ,执行的次数与输入无关。
-
线性阶:O(n) ,执行的次数与输入成正比关系。例如:一层循环。
-
平方阶:O(n^2) , 执行的次数与输入成平方关系。例如:二层循环
-
立方阶:O(n^3) ,执行的次数与输入成立方关系。例如:三层循环
-
对数阶:O(log2n) , 执行的次数与输入成开方关系。例如:求对数 log28 = 3
-
线性对数阶:O(nlog2n)
- O(log2n) 指数计算:R表示次数
-
O (n) :一层循环
-
O(n^2):二层循环(99乘法表)
int n = 9;
for(int i = 0 ; i < n ; i ++) {
for(int j = 0 ; j < n : j ++) {
// 次数 n*n
}
}
- O(n^3):三层循环
int n = 9;
for(int i = 0 ; i < n ; i ++) { //时针
for(int j = 0 ; j < n : j ++) { //分针
for(int m = 0 ; m < n ; m++) { //秒针
// 次数 n * n * n
}
}
}
算法分析:最好、最坏、平均
* 实例:从数组中获得内容 a[1...n]
* 最好时间复杂度:获得最好的情况,例如:数组中的第一个数据。O(1)表示此情况。
* 最坏时间复杂度:获得最坏的情况,例如:数据中最后一位。O(n)表示此情况。
* 平均时间复杂度:
* 1+...+n和 : (n+1) * n/2
* 平均,和/n :(n+1) * n/2 / n ---> (n + 1) / 2 --> O(n)表示
* 结论:在一般情况下,取`最坏时间复杂度`或`等概率下的平均时间复杂度`作为算法的时间复杂度。
西格玛求和
需求:1+2+3+4+....+n