leetcode
leetcode 1451 ~ 1500
两个稀疏向量的点积

两个稀疏向量的点积

难度:

标签:

题目描述

代码结果

运行时间: 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)

代码细节讲解

🦆
为什么在实现稀疏向量点积时选择使用列表和字典两种不同的数据结构?各有什么优缺点?
在实现稀疏向量点积时,使用列表和字典两种数据结构主要是为了利用各自的数据结构特性来优化性能。列表方法中,通过存储索引和值的对,可以在遍历时通过双指针技术有效地查找和计算匹配索引的值。这种方法的优点是在两个向量都较为稀疏且索引分布均匀时,能够高效地进行匹配和计算。缺点是需要手动管理索引位置,且在两个向量非零元素数量差异较大时效率可能会降低。字典方法通过键值对直接存储索引和值,查找效率高,适合非零元素索引随机分布的情况,特别是当一个向量非常稀疏而另一个相对密集时。但是,这种方法可能在内存使用上不如列表方法经济,特别是在非零元素极少的情况下。
🦆
在使用双指针技术进行点积计算时,指针移动的条件是什么?为什么当两个索引不相等时要移动较小索引的指针?
在使用双指针技术进行点积计算时,两个指针分别指向两个向量的非零元素。指针移动的条件是比较两个非零元素的索引:如果两个索引相等,则计算乘积并将两个指针同时向前移动;如果不相等,则移动较小索引的指针以便尽快找到下一个可能的匹配。这种移动方式是因为,只有当两个索引相等时,才能贡献到点积的结果中,移动较小的索引可以快速跳过那些无法匹配的索引,从而提高遍历的效率。
🦆
考虑到稀疏向量中可能存在大量的零,这两种方法在处理极端稀疏的情况下性能表现如何?
在极端稀疏的情况下,即向量中非零元素极少时,两种方法的性能表现各有千秋。列表方法的性能主要受到两个向量中非零元素数量的影响,如果两个向量的非零元素数量相对均衡且都很少,那么双指针遍历的效率很高,因为它可以快速跳过大量的零。字典方法在这种情况下也表现良好,尤其是当其中一个向量非常稀疏而另一个非零元素稍多时,因为只需遍历非零元素更少的向量的索引,并检查这些索引在另一向量中是否也是非零的。总的来说,字典方法在处理非常不均匀的稀疏向量时可能稍优一些,因为其查找操作是常数时间的,而列表方法在非零元素分布相对均匀时效率更高。

相关问题