【问题标题】:How to count number of duplicate pairs in multimap如何计算多图中重复对的数量
【发布时间】:2020-02-21 15:58:29
【问题描述】:

如何计算整数对的多重映射中重复对(具有相同键和值)的数量?

例如,我的多图包含对 {(6,2)、(6,2)、(6,3) 和 (6,4)},因此重复计数为 1,因为我的中有 1 个重复对多图。我尝试过使用 find() 和 count() 等方法,但无济于事。任何帮助将不胜感激!

【问题讨论】:

  • 我强烈建议您尽最大努力(minimal reproducible example 格式)。它可能只需要一个小的修正,如果不需要,它提供了一个基线,人们可以围绕该基线撰写最适合您目标的答案。另外,不要低估展示您已投入时间解决问题的社会效益,并且不要简单地期望让其他人为您完成工作。
  • 感谢您的回复,很抱歉没有必要的代码,因为这只是我算法中的一个想法,我不确定它是否会起作用。但是,我一直在考虑比较多图中的每一对,但我不确定该怎么做。
  • 从您的多地图制作std::setstd::set<std::pair<int,int>> s{m.begin(),m.end()};(其中m 是多地图)以及您将获得的重复数量:m.size() - s.size()
  • 如果 被限制在 int 的某个 小区间,例如大小 k,您可以使用线性复杂度和 O(k) 辅助内存存储快速完成此操作。遍历算法是here in the second answer,要计算特定键的重复项,您只需要一个大小为 k 的数组。它可能比使用动态内存分配的 set/unored_set 快得多。
  • 谢谢@rafix07,您应该考虑将其作为答案!

标签: c++ duplicates multimap


【解决方案1】:

一种常见的方法是使用std::set。这不能包含重复的数据。

我们将尝试使用其范围构造函数将所有数据放入std::set。使用 CTAD 让写作更轻松。

然后我们将std::multimap 的大小与std::set 的大小进行比较,并得到所有重复项的数量。

所以它归结为一个非常简单的程序。请看:

#include <iostream>
#include <map>
#include <set>

int main()
{
    // Source data
    std::multimap<int, int> mm = { {6, 2}, {6, 3}, {6, 2}, {6, 4} };

    // Use range constructor and CTAD to put the data into a set
    std::set s(mm.begin(), mm.end());

    // Show result
    std::cout << "Number of duplicates: " << mm.size() - s.size() << "\n";

    return 0;
}

如果有不同的要求,请反馈,我会创建一个额外的解决方案。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2017-01-08
    • 2020-07-29
    • 2021-12-12
    • 2021-01-29
    • 1970-01-01
    • 2021-04-27
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多