从地图std :: map <std :: pair <int,=“”int =“”>,int&gt; </std :: pair <>生成特定项目的所有大小为k的子集

时间:2014-02-02 04:35:45

标签: c++ map combinations

我没能编写一个函数来生成map std :: map,int&gt;的所有可能组合(n选择k)。

例如:我创建了这个地图,Mymap

(( 1, 2 ), 1)
(( 1, 3 ), 1)
(( 1, 4 ), 1)
(( 2, 3 ), 2)
(( 2, 4 ), 3)
(( 2, 5 ), 1)
(( 3, 4 ), 2)
(( 5, 4 ), 1)

基于Mymap,我想生成所有可能的组合(n选择k),其中n(1,2,3,4,5),k是子集的大小。

更多详细信息,基于Mymap,我们可以找到:

1:存在于对(1,2),(1,3)和(1,4)

这给了我第一组{2,3,4}我想为'1'生成所有可能的组合

如果k = 2那么,'1'的组合是:

1,2,3
1,2,4
1,3,4

具体来说,我想将结果保存在新地图“ Mymap2 ”中,如:

((1,2) (1,3), 2) // number 2 because I add the values for these two pairs (( 1, 2 ), 1) + (( 1, 3 ), 1)

((1,2) (1,4), 2)
((1,3) (1,4), 2)

然后,我为'2'做同样的事情

2:存在于对(1,2),(2,3),(2,4)和(2,5)

这给了我{1,3,4,5}集,我想为'2'生成所有可能的组合

如果k = 2那么,'2'的组合是:

2,1,3
2,1,4
2,1,5
2,3,4
2,3,5
2,4,5

这个结果,将存储在Mymap2中

 ((2,1) (2,3), 2)
 ((2,1) (2,4), 5)
 ((2,1) (2,5), 2)
 ((2,3) (2,4), 5)
 ((2,3) (2,5), 2)
 ((2,4) (2,5), 4)

并重复相同的步骤,为3,4,5

为了做到这一点,我创建了新的地图(std :: map&gt; Item),其中k值是(1,2,3,4,5),值是关联项的集合

例如,将映射为:

(1, {2,3,4})
(2, {1,3,4,5})
(3, {1,2,4})
(4, {1,2,3,5})
(5, {2,4})

这是创建'Item'的代码

for (const auto& p1 : Mymap)
    {
        Item[p1.first.first].push_back(p1.first.second);
        Item[p1.first.second].push_back(p1.first.first);

    }

它也给了我每组的大小,所以,如果用户设置k = 4,并且我们知道(例如)1与3个项目相关联,我们设置k = 3,

这是我的代码,仅当k&gt; =关联项目数

时才有效

例如:如果我们设置k = 3或更高,并且我们想测试=(1,{2,3,4}),这意味着:1与3个项目相关联,那么这个代码输出正确,但是如果k = 2,那么我将得到错误。

仅在以下情况下有效:

    int k = 0;
   std::map <int, vector <int> > Kcom;

    int i = 1;

    for (const auto& p1 : Item)
    {
        k=2;
        if (k > Item[p1.first].size())
            k = Item[p1.first].size();

        int count = 1;
        int c = 0;
        int j = Item[p1.first].size();



        while  (c != j)
        {
            cout << Item[p1.first].size();
            cout << "\n";


        while (count <= k)
            {

                 Kcom[i].push_back(p1.second[c]);
                ++c;
                ++count; 
            }
            ++i;
            // if j > k then
            //-----

            count = 1;

        }


    }

请帮忙。

0 个答案:

没有答案