c#中的部分组合/排列-例如A,B,C = {A,B}, {A,C}, {B,C}

本文关键字:-例如 排列 组合 | 更新日期: 2023-09-27 18:15:00

有许多出色的排列实现-我在链接中选择了Sam的答案。

我也知道排列和组合之间有区别,但我不知道如何恰当地表达。

我需要获得所有唯一部分组合的指导,例如

A,B,C = {A,B}, {A,C}, {B,C}
A,B,C,D = {A,B,C},{A,B,D},{B,C,D},{A,C,D},{A,B}, {A,C}, {B,C}

从这里,我将把它传递给排列函数以获得所有可用的排列,例如:{A,B}, {B,A}, {A,C}, {C,A}

如何得到大集合的这些(部分)子集?

c#中的部分组合/排列-例如A,B,C = {A,B}, {A,C}, {B,C}

实现递归是很容易的。在GetSubCombinations函数中遍历一个虚拟树,总是先返回不包含当前元素的集合,然后再返回包含当前元素的集合。在最后一层(GetSubCombinations函数的第一部分),您生成要返回的列表,要么包含最后一个元素,要么为空。

代码:

using System.Collections.Generic;

class Program {
    private static IEnumerable<List<char>> GetSubCombinations(char[] elements, uint startingPos)
    {
        // Leaf condition
        if (startingPos == elements.Length - 1)
        {
            yield return new List<char> {elements[startingPos]};
            yield return new List<char>();
            yield break;
        }
        // node splitting
        foreach (var list in GetSubCombinations(elements, startingPos + 1))
        {
            yield return list;
            list.Add(elements[startingPos]);
            yield return list;
            list.Remove(elements[startingPos]);
        }
    }
    private static IEnumerable<List<char>> GetPartialCombinations(char[] elements)
    {
        foreach (var c in GetSubCombinations(elements, 0))
        {
            // Here you can filter out trivial combinations,
            // e.g. all elements, individual elements and the empty set
            if (c.Count > 1 && c.Count < elements.Length)
                yield return c;
        }
    }

    static void Main(string[] args) {
        char[] elements = new char[] {'A', 'B', 'C'};
        foreach (var combination in GetPartialCombinations(elements))
        {
            foreach (char elem in combination)
                System.Console.Write(elem + ", ");
            System.Console.Write("'n");
        }
        return;
    }
}

排列与组合的区别在于排列的顺序。

根据我的理解,你想要所有的组合,因此,所有不满足确切集合的组合(您想要创建一个子集)

,

对于S = {A,B,C,D},部分组合的一个例子是{A,C,B},因为它不关心顺序,也不包含完整的集合(即。它是S)

的子集

组合公式为N choose K

你的集合有4个元素(N)而你想要一个小于等于3个元素的集合(K)

So N!/K!(N-K)! 
3: = 4!/3!(4-3)! = (1x2x3x4)/(1x2x3)(1) = 4
2: = 4!/2!(2)! = 1x2x3x4/(1x2x1x2) = 6
1: = 4!/1!(4-1)! = 1x2x3x4/1x2x3 = 4

因此答案是14

如果你想要一些关于如何实现组合计算的代码:SOURCE

private static void GetCombination(List<int> list)
{
    double count = Math.Pow(2, list.Count);
    for (int i = 1; i <= count - 1; i++)
    {
        string str = Convert.ToString(i, 2).PadLeft(list.Count, '0');
        for (int j = 0; j < str.Length; j++)
        {
            if (str[j] == '1')
            {
                Console.Write(list[j]);
            }
        }
        Console.WriteLine();
    }
}