当前位置: 首页 > 知识库问答 >
问题:

从两个加权集合中按照每个对的求和权重的顺序有效地计算对

王才
2023-03-14

假设我有两组数据,每个条目由一个权重组成。每一套都是按重量升序排列的。我将列出几个示例集:

Set 0: {4, 8, 19, 25, 25, 26}    
Set 1: {1, 2, 3, 8, 20, 27}

共有1个答案

鲍国兴
2023-03-14

让我们表示两个排序列表A(大小m)和B(大小n)。

算法:

  1. 计算所有i=0到n-1的a[0]和b[i]之和。您需要从列表A中确定和包括了哪个元素--一种方法是附加索引(这里所有和都是0)。将所有对推入按和排序的最小堆。
  2. 弹出堆,取出总和。使用所附的索引与列表A中的下一个元素计算和。如果索引已经是m-1,则不需要做任何事情;否则,增加索引并将其推回到堆中。
  3. 重复步骤2,直到堆为空(对于所有m*n值)。

通过使用上面算法中较小的列表作为列表B,我们可以实现稍微好一点的时间复杂度(我们只需要管理一个小堆而不是一个大堆)。

使用std::priority_queue的实现(由堆栈器):

#include <iostream>
#include <set>
#include <queue>
#include <limits>

std::multiset<int> set1 {4, 8, 19, 25, 25, 26};
std::multiset<int> set2 {1, 2, 3, 8, 20, 27};

struct Node
{
  Node(std::multiset<int>::const_iterator set1Iterator, int set2Value) :
    set1Iterator(set1Iterator),
    set2Value(set2Value),
    sum(*set1Iterator + set2Value)
  {
  }

  bool operator < (const Node& other) const
  {
    return sum > other.sum; // Reverse order as std::priority_queue sorts for the greatest value
  }

  std::multiset<int>::const_iterator set1Iterator;
  int set2Value;
  int sum;
};

int main()
{
  std::priority_queue<Node> heap;
  for (auto i = set2.begin(); i != set2.end(); ++i)
    heap.push(Node(set1.begin(), *i));

  while (!heap.empty())
  {
    Node min(heap.top());
    heap.pop();

    std::cout << *min.set1Iterator << " + " << min.set2Value << " = " <<
      min.sum << std::endl;
    if (++min.set1Iterator != set1.end())
    {
      min.sum = *min.set1Iterator + min.set2Value;
      heap.push(min);
    }
  }
  return 0;
}
 类似资料:
  • 我有两个集合,每个集合是一对数字的列表 如果绘制在XY平面上,Set1和Set2具有相同的基本形状,但是Set2的数据点是Set1的旋转/平移/缩放/噪声/倾斜版本。每个集合中的配对顺序是随机的。有没有一种有效的方法来确定set1中的哪些点对应于set2中的对应点?

  • 问题内容: 小写列表或集合的每个元素的最有效方法是什么? 我对清单的想法: 有没有更好,更快的方法?对于Set,此示例的外观如何?由于当前没有方法可以将操作应用于集合(或列表)的每个元素而无需创建其他临时集合? 这样的事情会很好: 谢谢, 问题答案: 对于列表,这似乎是一个非常干净的解决方案。它应该允许使用特定的List实现,以提供对于线性遍历列表和在恒定时间内替换字符串都是最佳的实现。 这是我可

  • 我试图通过DP找到所有子数组的加权平均值,然后按列排序,找到长度相同的2。但我无法继续下去,我的方法似乎太模糊/太粗暴了。我将非常感谢任何帮助。提前谢了。

  • 问题内容: 说,有两个哈希集,如何计算它们的交集? 问题答案: 使用以下方法: 如果要保留集合,请创建一个新集合以保存交集: 该的的说,这正是你想要的: 仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除所有未包含在指定集合中的元素。如果指定的集合也是一个集合,则此操作将有效地修改此集合,以使其值为两个集合的交集。

  • 给我一个图中名为“a”的顶点,对于v中的每一个v,我需要找到从a到v的路径的权重,它在时间O(v+E)中权重最低。我不得不只使用BFS或DFS(尽管这很可能是BFS的问题)。 我想过要制作一个新的图,其中边为0的顶点是统一的,然后在它上面运行BFS,但是这会破坏图的方向(如果图是无向的或者权重是{2,1},对于边为2,我会创建一个新的顶点)。 如果有任何帮助,我将不胜感激。 谢谢

  • 我想知道如何在单个请求上添加多个权限。这是关于Marshmallow版本的Android。