传统计算购物车总价都是for循环中单价*数量相加,还有什么办法?抛砖引玉的开始接触矩阵算法。
在此之前需要了解矩阵的基本知识 - 矩阵的运算及其运算规则
运算规则总结:
- 矩阵加减法:只有两个同型矩阵(行数 & 列数相同)才能进行相加减,满足交换律和结合律。
- 矩阵&数相乘: 数 * 矩阵中的每个数,满足分配律和交换律
- 矩阵&矩阵相乘: 只有当左边矩阵的列数等于右边矩阵的行数时,才可以相乘,乘积矩阵的行数等于左边矩阵的行数,乘积矩阵的列数等于右边矩阵的列数,矩阵的乘法是左行乘右列。
尝试使用java用矩阵来计算购物车总价
首先引入java矩阵包ujmp-core
<!-- 矩阵类和线性代数函数 -->
<dependency>
<groupId>org.ujmp</groupId>
<artifactId>ujmp-core</artifactId>
<version>0.3.0</version>
</dependency>
因为只有单价和数量,我们创建一个1xn 和 nx1的矩阵
在代码中,我们先定义一个List集合模拟上图矩阵中的1,2,3
@Data
class Number {
// 单价
private BigDecimal price;
// 数量
private Integer quantity;
}
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
*/
public static List<Number> getList() {
List<Number> list = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
Number number = new Number();
number.setPrice(new BigDecimal(i));
number.setQuantity(i);
list.add(number);
}
return list;
}
创建一个 1xn的矩阵,即1行n列,并进行赋值
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
* 能日赚30手赚试玩平台,推荐使用iphone操作
* https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
*/
List<Number> list = getList();
Matrix matrix1 = DenseMatrix.Factory.zeros(1, list.size());
for (int i = 0; i < list.size(); i++) {
Number number = list.get(i);
matrix1.setAsBigDecimal(number.getPrice(), i, 0);
matrix1.setAsInt(number.getQuantity(), 0, i);
}
System.out.println(matrix1);
输入如下
第二个矩阵,直接使用第一个矩阵的话,我们需要用到转置,做乘法矩阵1的行数必须等于矩阵2的列数,且为行的矩阵在前。
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
*/
Matrix matrix2 = matrix1.transpose();
System.out.println(matrix2);
输出如下
将矩阵1 * 矩阵2,实现计算
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
*/
Matrix matrix = matrix1.mtimes(matrix2);
System.out.println(matrix);
输出如下
计算过程为 (1 * 1) + (2 * 2) + (3 * 3) = 14
和for循环比较一下运行时间谁更快,定义一个for循环
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
*/
BigDecimal totalFee = BigDecimal.ZERO;
for (Number number : list) {
BigDecimal big = number.getPrice().multiply(new BigDecimal(number.getQuantity()));
totalFee = totalFee.add(big);
}
System.out.println("for 循环 = " + totalFee);
当数据少时,for循环的运行速度比矩阵快
当我把模拟数据加大,再次运行
/**
* @Author: zengwei
* @Email: 1014483974@qq.com
* 能日赚30手赚试玩平台,推荐使用iphone操作
* https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
*/
public static List<Number> getList() {
List<Number> list = new ArrayList<>();
for (int i = 1; i <= 1000000; i++) {
Number number = new Number();
number.setPrice(new BigDecimal(1));
number.setQuantity(1);
list.add(number);
}
return list;
}
输出结果,当数据量大的时候,矩阵和for循环的区别就出来了
目前也正在学习中,有不妥的地方可以指出,互相学习,互相进步
未经允许,禁止转载
本作品采用知识共享署名 4.0 国际许可协议进行许可。