【发布时间】: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 个最大的数字。 我的方法是:
- 查找产品并将值存储在向量中。 (时间- O(N^2) )。
- 对向量进行排序。 (时间 - O(N logN))
- 通过索引访问查找第 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。这应该足以帮助您在网上找到材料。抱歉,现在无法找到解决方案。