【问题标题】:Multiply elements of a vector with all elements of same vector将向量的元素与同一向量的所有元素相乘
【发布时间】:2015-01-20 14:12:02
【问题描述】:

我正在尝试解决一个问题,我想将向量的元素与同一向量的所有元素相乘(也与 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 个最大的数字。 我的方法是:

  1. 查找产品并将值存储在向量中。 (时间- O(N^2) )。
  2. 对向量进行排序。 (时间 - O(N logN))
  3. 通过索引访问查找第 n 个最大的数。

我想提高 N^2 的时间复杂度。

【问题讨论】:

  • 据我所知,这不能比 N^2 更快,因为这是输入的大小。
  • 您的结果有 N*N 个元素,对吗?你认为你如何能在少于 O(N^2) 的时间内产生 N*N 个数字?
  • 这是您的最终目标还是您认为有意义的中间步骤?正如@BenVoigt 指出的那样,您正在尝试生成大小为O(N^2) 的输出。你的算法需要时间O(N^2) 来做到这一点。但是,如果这不是最终目标,那么可能会有更聪明的事情可以做。
  • @Pradhan 我想找出列表中包含数组所有元素乘积的第 n 个最大元素。所以我决定全部相乘,存储在一个向量r中,降序排序,得到第n个元素。有更好的方法吗?
  • @AkshayArora 您的问题可以简化为在“排序矩阵”中找到第 k 个最大元素的问题 - 看起来像 Young's Tableau。这应该足以帮助您在网上找到材料。抱歉,现在无法找到解决方案。

标签: c++ vector


【解决方案1】:

您可以做的是避免两次计算相同的值。实际上,使用您的解决方案,所有对将乘以两倍。如果您在矩阵中显示结果值,这一点最明显:

input: [a, b, c]

output:

aa ba ca
ab bb cb
ac bc cc

你可以看到对角线两边的对称性。这意味着在计算第 n 列时,您只需要计算 size of input - n 值,因为其他 n 已经存在于前面的列中,您可以在其中检索它们。

但请注意,这不会影响算法的复杂性。

【讨论】:

    【解决方案2】:

    在当前公式中,此问题无法在 O(n) 时间内解决,因为输出包含 O(n^2) 元素。

    【讨论】:

    • 但是,原始问题中给出的代码与那里描述的问题不匹配。
    • 确实如此,虽然含糊不清。
    • 感谢您的提示;我会改变我的答案。
    • @BenVoigt 很抱歉,您之前已经指出所需的输出与输出大小相矛盾。
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多