日撸Java三百行(Day 8)

预备知识

时间复杂度

算法的时间复杂度是什么,又该如何计算?(用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中常用两种方式:

  1. try-catch-finally(可能出现异常的代码-处理方式-一定执行,但外面的后续代码不执行)
  2. 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)对于矩阵乘法的代码,一方面是本身正确输入时代码的编写,另一方面是对用户友好的非法输入检查。(真是考虑周到,佩服!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值