来自一组集合的所有可能组合(n选择k)

时间:2013-11-20 07:42:27

标签: c# set combinatorics

给出了几个集合,例如{1,2,3,4}{1,2}{1}{1,2,3,},...和数字k,以便应该进行组合要形成的长度恰好是k如果我只能从每个集合中选择一个数字,那么如何生成长度k的唯一组合?

正好有多少套可供选择。我正在寻找在c#中执行此操作的最有效方法。

直觉上我尝试(尽管我不确定它是否正确)为每个集合生成所有可能的组合,然后将每个集合中的每个第i个组合与后续集合中的相应第i个组合连接起来以形成{{1长期独特的组合,但我确信这类问题有一般情况。

任何人都可以提供一些提示或建议吗?具体是哪个数学或计算机科学主题,以及这些问题通常如何解决?

在数组中字符串下方的片段中,例如“31” 这意味着k = 2(在集合中字符串的长度)并且有两组,其中一组是{1,2,3}和{1}。使用这些集合,生成所有唯一组合并提供计数

k

1 个答案:

答案 0 :(得分:0)

您可以使用LINQ解决此问题:

    private void CombineSets()
    {
        var mySets = new List<HashSet<int>>();
        mySets.Add(new HashSet<int>() { 1, 2, 3, 4 });
        mySets.Add(new HashSet<int>() { 1, 2 });
        mySets.Add(new HashSet<int>() { 1 });
        mySets.Add(new HashSet<int>() { 1, 2, 3 });

        var result = new HashSet<int>();


        while (mySets.Count > 0)
        {
            //get the smallest set
            var set = mySets.OrderBy(x => x.Count).First();
            //remove the set from the collection as we do not need it anymore (we got our value)
            mySets.Remove(set);
            //remove what is in the result from the set (as we only want unique values)
            set.ExceptWith(result);
            //then add the first value from the remaining values to our result set
            result.Add(set.First());

        }
    }

为了提高效率,您还可以在while循环之前对列表进行排序。这至少解决了你问题的前几行。

希望这会有所帮助:)