我正在尝试解决一个问题,即我想将向量的元素与相同向量的所有元素相乘(也乘以self)。
我有一个有效的解决方案,如下:
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v.size();j++)
{
r.insert(v[i]*v[j]);
}
}
此处,v
是我的元素最初存储的向量,r
是我存储产品的向量。
我面临的问题:
这是一个O(N ^ 2)算法,我想在O(N)时间内实现这一点。 有没有办法实现这个目标? 感谢。
编辑1:
实际上我想找到通过将向量的元素与每个其他元素相乘得到的数字列表中的第n个最大数字。 我的方法是:
我想提高N ^ 2时间复杂度。
答案 0 :(得分:4)
您可以做的是避免两次计算相同的值。实际上,使用您的解决方案,所有对将成倍增加。如果在矩阵中显示结果值,则最好看到这一点:
input: [a, b, c]
output:
aa ba ca
ab bb cb
ac bc cc
您可以看到对角线两侧的对称性。这意味着在计算第n列时,您只需要计算size of input - n
值,因为其他n
已存在于之前的列中,您可以在其中检索它们。
请注意,这对算法的复杂性没有任何影响。
答案 1 :(得分:1)
此问题无法在当前公式的O(n)
时间内解决,因为输出具有O(n^2)
元素。