两个稀疏向量的点积
难度:
标签:
题目描述
代码结果
运行时间: 1188 ms, 内存: 21.6 MB
/*
* 题目思路:
* 1. 使用索引和值构造稀疏向量。
* 2. 使用Java Stream API进行遍历和计算。
*/
import java.util.HashMap;
import java.util.Map;
class SparseVector {
private Map<Integer, Integer> map;
public SparseVector(int[] indices, int[] values) {
map = new HashMap<>();
for (int i = 0; i < indices.length; i++) {
map.put(indices[i], values[i]);
}
}
// 计算两个稀疏向量的点积
public int dotProduct(SparseVector vec) {
return map.entrySet().stream()
.filter(entry -> vec.map.containsKey(entry.getKey()))
.mapToInt(entry -> entry.getValue() * vec.map.get(entry.getKey()))
.sum();
}
}
// 使用示例
// SparseVector v1 = new SparseVector(new int[]{1, 3, 5}, new int[]{4, 2, 1});
// SparseVector v2 = new SparseVector(new int[]{3, 5, 6}, new int[]{1, 3, 2});
// int result = v1.dotProduct(v2); // result is 5
解释
方法:
题解中包括两种方法来实现稀疏向量的点积。第一种方法是使用列表来存储非零元素的索引和值,第二种方法使用字典来存储非零元素的索引和值。在第一种方法中,通过双指针技术在两个向量的非零元素索引中进行遍历,当两个索引相等时计算乘积并累加到结果中。在第二种方法中,遍历一个向量的所有非零元素索引,检查这些索引是否在另一个向量中也是非零的,如果是,则计算乘积并累加到结果中。这两种方法都有效地利用了稀疏向量中大量零元素的特性,从而优化了计算点积的过程。
时间复杂度:
O(k)
空间复杂度:
O(k)
代码细节讲解
🦆
为什么在实现稀疏向量点积时选择使用列表和字典两种不同的数据结构?各有什么优缺点?
▷🦆
在使用双指针技术进行点积计算时,指针移动的条件是什么?为什么当两个索引不相等时要移动较小索引的指针?
▷🦆
考虑到稀疏向量中可能存在大量的零,这两种方法在处理极端稀疏的情况下性能表现如何?
▷