【问题标题】:Given m sets of n elements .Find the element which occurs in maximum number of sets in C++给定 m 个 n 个元素的集合。找到在 C++ 中出现在最大集合数中的元素
【发布时间】:2020-07-14 05:58:59
【问题描述】:

给定m 集合中包含n 元素的n 整数,找到出现在最大集合中的元素不是最大次数

这是我实现的算法。

  • 逐一扫描输入
  • 对于每个元素,计数器值都会递增。 这个计数器表示在集合之外的集合中出现的频率。我希望我在这里很清楚
  • 输出计数max(count)中的最大元素
 int main(){
   set <int> inner1;      //Here ,I have implemented just 2 sets 
   set <int> inner2;      
   set< set<int> > outer;      //a set of sets                 
   set< set<int> >:: iterator new_it;
   set<int >::iterator it;
  map <int ,int> count;  //the counter

   cout<<"enter the number of sets"<<endl;
   cin>>m;
   cout<<"enter the number of elements in each set"<<endl;
   cin>>n;
   for (int i=0;i<n;i++){
     int temp;
     inner1.insert(temp);
   }
   for (int i=0;i<n;i++){
     int temp;
     inner2.insert(temp);
   }
   outer.insert(inner1);       // a set of two sets .
   outer.insert(inner2);


  for (){
  for (){
    // THe MAIN CODE 
   
 }

我的问题-

  1. 我想以这样的方式实现它,它可以使用用户输入创建m sets in a set。 我现在尝试从 2 组开始实现它,但是我如何将它实现为 m 设置为 根据用户的意愿。
cout<<"enter the number of sets"<<endl;
cin>>m;
cout<<"enter the number of elements in each set"<<endl;
cin>>n;

我希望你明白要点

  1. 获取出现在最大集合中的元素的算法,即主代码

提前致谢。

【问题讨论】:

  • 您可以将一个集合插入到集合中,因此只需循环用户输入并执行此操作。迭代这组集合并作为元素添加到另一个地图中,并且该元素所属的集合没有。
  • 您不需要存储多于一套。数完一个集合的元素后,这个集合就不再有趣了。
  • 这个前提,“m 个包含 n 个元素的 n 个整数的集合”听起来很奇怪,因为它说了两次同样的事情。
  • @molbdnilo 是的..我认为你是对的,因为我已经复制粘贴了这个问题。

标签: c++ algorithm set


【解决方案1】:

我只是写代码,因为它容易理解:

unordered_map<int, int> global;

for(set<int> &s : sets){   //for each set you have
    for(int si : s) {      //for each element of the set (all unique by definition)
        global[si]++;
    }
}

int mostFrequent = *sets[0].begin();   //any existing element in any set is allowed
int frequency = global[mostFrequent];
for (auto& it: global) {              //for each element in all sets
    if(it.second > frequency) {
        mostFrequent = it.first;
        frequency = it.second;
    }
}

cout<<"answer is "<<mostFrequent<<endl;

你的问题有点奇怪,因为set,根据定义,不会有重复的元素,所以强调你没有没有意义> 想要出现“最大次数”的元素,因为它直接来自 set 的定义,该元素将与出现在 maximum 中的元素相同套数

如果您的意思是允许重复元素的set,您应该使用vectorlist。在这种情况下,解决方案是将这种结构转换为set

【讨论】:

  • 是的,你说得对,我本可以使用 list 或 vector 但这不是我打算做的。这个问题只需要使用集合来解决。
  • 这就是我只使用套装的原因。我刚刚提到了向量和列表,因为它们似乎适合您的情况。
【解决方案2】:

@Daniel 你也可以“累积”结果(因为 std::accumulate 可以用于任何事情)

using pint = std::pair<int, int>;
auto res = std::accumulate(count.begin(), count.end(), pint(0,0), 
    [](const auto& e1, const auto& e2) { return e1.second > e2.second ? e1 : (pint)e2; 
  }
);

https://godbolt.org/z/fha8v8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2012-11-03
    • 2016-11-09
    相关资源
    最近更新 更多