Различные комбинации массива (C #) - PullRequest
0 голосов
/ 04 октября 2011

как мы можем узнать различную комбинацию элементов массива, используя код на 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 и т. Д.

Например: допустимая комбинация для массива = {1, 2, 3} и длины = 2: 1 2,1 3,2 3 .....

Ответы [ 2 ]

2 голосов
/ 04 октября 2011
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;
                }
            }
        }
}

Вы должны взять алгоритм отсюда, мой ответ не решит вашу проблему Алгоритм возврата всех комбинаций k элементов из n

0 голосов
/ 29 сентября 2016

Кажущаяся логика не совсем верна, как:

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

Это дает 3 варианта, но на самом деле это 4:

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

Полагаю, гребень лучше реализовать рекурсивным способом.

...