递归查找子集

时间:2009-10-20 01:37:12

标签: c++ recursion

这是我正在尝试创建的递归函数,它找到在STL集中传递的所有子集。两个参数是设置为搜索主题的STL,并且数字i> = 0,其指定子集应该有多大。如果整数大于set,则返回空子集

我不认为我这样做是正确的。有时它是对的,有时它不是。 stl集合很好地传递。

list<set<int> > findSub(set<int>& inset, int i)
{
    list<set<int> > the_list;

    list<set<int> >::iterator el = the_list.begin();
    if(inset.size()>i)
    {

        set<int> tmp_set;
        for(int j(0); j<=i;j++)
        {
            set<int>::iterator first = inset.begin();
            tmp_set.insert(*(first));
            the_list.push_back(tmp_set);
            inset.erase(first);
        }

        the_list.splice(el,findSub(inset,i));
    }

    return the_list;
}

4 个答案:

答案 0 :(得分:3)

根据我的理解,你实际上是在尝试从给定的集合中生成'i'元素的所有子集吗?

修改输入设置会让你遇到麻烦,最好不要修改它。

我认为这个想法很简单,但我会说你倒退了。因为它看起来像家庭作业,我不会给你一个C ++算法;)

generate_subsets(set, sizeOfSubsets) # I assume sizeOfSubsets cannot be negative
                                     # use a type that enforces this for god's sake!
  if sizeOfSubsets is 0 then return {}
  else if sizeOfSubsets is 1 then
    result = []
    for each element in set do result <- result + {element}
    return result
  else
    result = []
    baseSubsets = generate_subsets(set, sizeOfSubsets - 1)
    for each subset in baseSubssets
      for each element in set
        if no element in subset then result <- result + { subset + element }
    return result

关键点是:

  • 首先生成较低等级的子集,因为您必须迭代它们
  • 如果元素已经存在,则不要尝试在子集中插入元素,它会为您提供不正确大小的子集

现在,您必须了解这一点,并将其转换为“真正的”代码。

答案 1 :(得分:1)

我一直在盯着这几分钟而且我无法弄清楚你认为 工作的思路是什么。在探索他们可以参与的每个可能的子集之前,您将永久删除输入列表的几个成员。

尝试使用伪代码编制您想要的解决方案,看看是否可以在没有stl干扰的情况下看到问题。

答案 2 :(得分:1)

似乎(我不是母语英语)你可以做的是计算功率集(所有子集的集合),然后只选择匹配条件的子集。

你可以找到如何计算Wikipedia Power set page和Math Is Fun上的权力集的方法(链接位于维基百科页面上的外部链接部分,名为Power Set from Math Is Fun,我不能直接在这里发布,因为垃圾邮件预防机制)。数学很有趣主要是它的二进制。

答案 3 :(得分:0)

我也看不出这应该达到的目标。

如果这不是具有特定限制的作业,我只是建议使用std::includes()对临时std::set进行测试。