预备知识
时间复杂度
算法的时间复杂度是什么,又该如何计算?(用Java讲时间复杂度)
算法运行的时间复杂度与算法中语句的执行次数成正比。举两个例子,比如for循环
for (int i = 0; i < m; i++) {}
就是1+m+m次,时间复杂度O(m)。(若里面嵌套一个for,那整个的时间复杂度自然是O(m)再乘以里面for的。
而
for (int i = 1; i < m; i=i*2) {}
就是
l
o
g
2
m
log_{2}{m}
log2m,时间复杂度O(
l
o
g
2
m
log_{2}{m}
log2m)。(2乘多少次达到m)
常见的复杂度:
数据规模小时,时间复杂度随n的变化
数据规模大时,时间复杂度随n的变化
个人一个不太准确的理解:时间复杂度看;与执行次数相关,用O估算,空间复杂度看变量个数与内存有关
非法输入检查
这个检查有什么作用?对用户友好。
老师说“要对用户行为有预见性”。我们设计函数的初衷是最简单最顺利的情形,但在执行中可能遇到其它情况,因此需要把情况考虑全面,对出现的错误/不在正常范围的情况做一个提示,即异常处理。异常处理,若用if ,else if来逐项说明太麻烦,所以Java中常用两种方式:
- try-catch-finally(可能出现异常的代码-处理方式-一定执行,但外面的后续代码不执行)
- throw(真正异常位置)/throws(提前打个预防针)
本例使用if判断:
// Step 1. Dimension check,
if (paraSecondMatrix.length != n){
System.out.println("The two matrices cannot be multiplied.");
return null;
}// Of if
程序健壮性
含义:指处理异常的能力,在异常中能够独立处理异常,并且把正确的答案输出。
方法:通过增加判断或者异常监控,永远知道使用的方法会返回什么。
代码运行情况
Tips:
1.public static先()再{}
2.if不是If
3.分号;
代码思路旁白
程序层次
- 包(basic)
- 类(MatrixMultiplication)
- 主程序(main)——矩阵乘法测试(matrixMultiplicationTest)
- 自定义方法(multiplication)——用if语句进行了非法输入检测(Step1)+正常的矩阵乘法(Step2)
- 单元测试(matrixMultiplicationTest)——生成两个矩阵:23和32+对两个矩阵进行乘法+对不能相乘的矩阵做乘法(对用户的预见性)
程序细节
矩阵乘法的程序实现
// Step 2.The loop.
int[][] resultMatrix = new int[m][p];
for (int i = 0; i < m; i++) {
for (int j=0; j < p; j++) {
for (int k = 0; k < n; k++) {
resultMatrix[i][j] += paraFirstMatrix[i][k]*paraSecondMatrix[k][j];
}// Of for k
}//Of for j
}// Of for i
return resultMatrix;
注意这里对一行乘一列[…]的处理:用中间变量k,从1到n的循环完成。
遇到的问题
对public static XXXXX(){}语句,为什么有的时候()里写输入参数,有的时候()里不写输入参数也可以?比如单元测试
我想自定义的方法是一定要写的,但是不是自定义的方法,比如main方法String[] args,什么时候写什么时候不写怎么判断?
小结
(1)计算时间复杂度上,基本搞明白了,视频讲解的很详细。
(2)对于矩阵乘法的代码,一方面是本身正确输入时代码的编写,另一方面是对用户友好的非法输入检查。(真是考虑周到,佩服!)