数组的不同组合(C#)

时间:2011-10-04 06:08:48

标签: c# algorithm combinations

如何使用c#代码找出数组元素的不同组合。 是否有任何内置的库函数。?

例如:假设一个数组有元素{2,3,4,5,6,7} 然后可能的组合是2,3,4,5,6,7,2 3,2 3 4,2 3 4 5等

所以基本上我需要的是一个函数,根据其输入给出不同的组合,例如:comb(array,2)给出输出2 3,1 2,3 4和comb(array,3)给出输出1 2 3 ,2 3 4,3 4 5等等

例如:array = {1,2,3}和length = 2的有效组合是1 2,1 3,2 3 .....

2 个答案:

答案 0 :(得分:2)

static void Main()
{
    var cnk = comb(new [] {1,2,3},2);
    foreach ( var c in cnk)
    {
    }
}

public static IEnumerable<int[]> comb(int[] a, int k)
{
    if (a == null || a.Length == 0 || k < 1 || k > a.Length)
        yield break;

    int n = a.Length;   
    // 1
    if ( k == 1)
        for ( int i = 0; i < n; i++)
        {   
            yield return new int[] {a[i]};
        }
    else
        {
            // k
            for ( int i = 0; i < n - k + 1; i++)
            {
                var res = new int[k];
                    for (int t = i, c = 0; t < i + k - 1; t++, c++)                 
                        res[c] = a[t];              
                for (int j = i + k - 1; j < n; j++)
                {                                                               
                    res[k-1] = a[j];                    
                    yield return res;
                }
            }
        }
}

你应该从这里拿算法,我的答案没有解决你的问题 Algorithm to return all combinations of k elements from n

答案 1 :(得分:0)

似乎逻辑不是绝对正确的:

visibility: hidden;

这给出了3个变体,但事实上它是4:

var cnk = comb(new[] { 1, 2, 3, 4 }, 3);

我猜梳子最好以递归方式实现。