c++ - 添加要迭代设置的元素

标签 c++ algorithm

假设我有一个数组{1,2,3},我必须像这样添加这些元素来设置

Pass 1: {1}, {2}, {3} (Adding sets of size 1 )
Pass 2: Pass1 + {1,2}, {1,3} , {2,3} (Combination of sets of previous pass and sets of size 2)
Pass 3: Pass2 + {1,2,3}

最后我的集合应该有 {1},{2},{3}, {2,3},{1,3},{1,2},{1,2,3}

我试着写这个

void generateSets(int arr[], int size, int sum)
{
    set<set<int> > mySet;
    for(int i=0;i< size ; i++)
    {
        set< set<int> >::iterator iter;
        **for (iter = mySet.begin(); iter != mySet.end(); ++iter) 
            {**
            set<int> s(*iter);
            for(int k=0;k<size; k++)
                    {
                s.insert(arr[k]);
                }
            mySet.insert(s);
        }
    }
}

我无法像我提到的那样生成集合。请有人可以帮助我!!

最佳答案

实现它的方法通常涉及递归或类似的东西。
想法是“让递归处理”不包含 1 个元素的子集,一旦拥有它,就需要添加包含该元素的子集。

它看起来应该类似于:(这是一个类似 C++ 的伪代码,而不是一个工作代码!)

//extend(set<set<int>>, int) is an auxilary function used by the main logic function
set<set<int>> extend(set<set<int>> original, int e) { 
   set<set<int>> result = new set<set<int>>();
   for each set<int> s in original { 
       tempSet = s.clone();  
       tempSet.add(e);
       result.add(tempSet);
   }
   return result;
}

//this is the main logic function
set<set<int> > findSets(int[] arr, int size) { 
   if (size == 0) return new set<set<int>>(new set<int>()); //return a set containing only an empty set
   set<set<int>> results = new set<set<int>>(); //result set
   results = findSets(arr,size-1); //all subsets without element arr[n-1], using recursion.
   results.union(extend(results,arr[size-1]); //add all subsets containing arr[n-1]
   return results;
}

关于c++ - 添加要迭代设置的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18146406/

相关文章:

c++ - VirtualAlloc 的困惑 - 它只适用于页面吗?

c++ - std::map - 删除最后一个元素

c++ - 从重复的两个列表中生成所有组合

c - 找到平均值的更好算法

java - 矩形网格中正方形网格的最小数量[JAVA]

c++ - QAbstractTableModel编辑而不清除单元格中的先前数据

c++ - vector 问题的算法

c++ - 仅优化球线检查?

c# - 2d-bin-packing 将矩形放置在 x,y 位置的算法?

java - 归并排序的基本条件