v1 = [1, 2, 0, 0, 1]
v2 = [1, 0, 0, 1, 2]
dot(v1, v2) = 1 * 1 + 1 * 2 = 3
稀疏向量
0的数量 > 95%
你的任务:
1)设计一个数据结构来表示稀疏向量,空间需要比较紧凑
2)基于这个数据结构,实现稀疏向量的点积。
思路:
定义两个数组 indexs 与 values ,分别存储 向量的下标 与 对应值。,只存储非 0 值
Java
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
int[] v1 = {1, 2, 0, 0, 1};
int[] v2 = {1, 0, 0,1, 2};
CalculateVectorDot cal = new CalculateVectorDot(v1, v2);
int result = cal.getDotValue();
System.out.println(result);
}
}
class VectorT {
public List<Integer> indexs = new LinkedList<>();
public List<Integer> values = new LinkedList<>();
int len = 0;
public VectorT(int[] v){
for(int i=0; i<v.length; i++) {
if(v[i] != 0) {
indexs.add(i);
values.add(v[i]);
len++;
}
}
}
}
class CalculateVectorDot {
private VectorT a;
private VectorT b;
public CalculateVectorDot(int[] v1, int[] v2){
a = new VectorT(v1);
b = new VectorT(v2);
}
public int getDotValue() {
int result = 0;
int indexA = 0;
int indexB = 0;
while(indexA<a.len && indexB < b.len) {
if(a.indexs.get(indexA) == b.indexs.get(indexB)) {
result += a.values.get(indexA) * b.values.get(indexB);
// System.out.print("indexA: "+indexA+", indexB"+indexB);
indexA++;
indexB++;
} else if(a.indexs.get(indexA) < b.indexs.get(indexB)) {
indexA++;
} else {
indexB++;
}
}
return result;
}
}