给定包含n
元素的n
整数的m
集合,找到出现在最大集合数中的元素,而不是出现在最大次数中。
这是我实现的算法。
- 逐个扫描输入
- 对于每个元素,计数器值都会递增此计数器表示不在集合内的集合中出现的频率我希望我清楚
- 从计数
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
}
我的问题-
- 我希望以这样的方式实现它,即它可以使用用户输入创建
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;
我希望你明白的要点
- 获取元素的算法,该元素出现在最大数量的集合中,即主代码
提前感谢。
我只编写易于理解的代码:
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
中不会有重复的元素,所以强调你不想要出现在">最大次数";,因为它直接来自CCD_ 8的定义,该元素将与最大集合数中出现的元素相同。
如果您指的是允许重复元素的set
,则应使用vector
或list
。在这种情况下,解决方案是将这种结构转换为set
。
@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