Различные комбинации массива (C#)

как мы можем узнать различную комбинацию элементов массива, используя код С#. есть ли встроенная библиотечная функция для этого?

например: предположим, что массив имеет элементы {2,3,4,5,6,7}, тогда возможная комбинация будет 2,3,4,5,6,7,2 3,2 3 4,2 3 4 5 , так далее

поэтому в основном мне нужна функция, которая дает различную комбинацию на основе ее ввода, например: гребенка (массив, 2) дает вывод 2 3,1 2,3 4 и гребенка (массив, 3) дает вывод 1 2 3,2 3 4,3 4 5 и так далее

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


person iJade    schedule 04.10.2011    source источник
comment
Какие комбинации вы хотите?   -  person Albin Sunnanbo    schedule 04.10.2011
comment
Что вы имеете в виду под комбинацией? Вы имеете в виду все комбинации, где элементы в разном порядке считаются одинаковыми, и все элементы массива объединяются как свои собственные массивы?   -  person Joshua Enfield    schedule 04.10.2011
comment
Что вы на самом деле имеете в виду под другой комбинацией?   -  person Sai Kalyan Kumar Akshinthala    schedule 04.10.2011
comment
Вы ищете перестановки? stackoverflow.com/questions/1272828 /   -  person Jon Skeet    schedule 04.10.2011
comment
(Кстати, проголосовали против из-за отсутствия ясности. Если вы проясните вопрос, я с радостью уберу отрицательный голос. На данный момент на вопрос нельзя ответить с какой-либо уверенностью, что ответ удовлетворит то, что вы на самом деле пытаюсь сделать.)   -  person Jon Skeet    schedule 04.10.2011
comment
я обновил свой вопрос, пожалуйста, проверьте   -  person iJade    schedule 04.10.2011
comment
Ваш пример не имеет для меня никакого смысла. Можете ли вы объяснить, как вы получили эту «комбинацию»?   -  person Piotr Auguscik    schedule 04.10.2011
comment
поэтому в основном мне нужна функция, которая дает различную комбинацию на основе ее ввода, например: гребенка (массив, 2) дает вывод 2 3,1 2,3 4 и гребенка (массив, 3) дает вывод 1 2 3,2 3 4,3 4 5 и так далее   -  person iJade    schedule 04.10.2011
comment
поэтому в основном мне нужна функция, которая дает различную комбинацию на основе ее ввода, например: гребенка (массив, 2) дает вывод 2 3,1 2,3 4 и гребенка (массив, 3) дает вывод 1 2 3,2 3 4,3 4 5 и так далее   -  person iJade    schedule 04.10.2011
comment
обновил мой вопрос ... пожалуйста, будьте достаточно скромны 2, проверьте его еще раз ....   -  person iJade    schedule 04.10.2011
comment
@Jay: Итак, вам нужны все возможные перестановки данной длины. (Честно говоря, вопрос мог бы быть и более ясным...) Хм, подождите - все примеры, которые вы привели, сохранили порядок элементов - это тоже требование? Или 3 1 2 допустимая комбинация?   -  person Jon Skeet    schedule 04.10.2011
comment
порядок элементов не требуется......ya 3 1 2 является допустимой комбинацией..   -  person iJade    schedule 04.10.2011
comment
если 3 1 2 правильный, то я пропал :)   -  person Adrian Iftode    schedule 04.10.2011
comment
Джей, не обижайся, обычно, когда кто-то работает над алгоритмом, ему нужно сначала получить на бумаге решение для заданного ввода. Если слов недостаточно для описания проблемы, должно хватить примера ввода/вывода. Поэтому, пожалуйста, обновите свой вопрос для следующего ввода: массив = {1, 2, 3} и длина = 2, каковы все возможные результаты, которые вы ожидаете.   -  person Adrian Iftode    schedule 04.10.2011
comment
Вот допустимые комбинации 1 2,1 3,2 3 ....и извините за приведенную выше комбинацию 3 1 2..она недействительна...я запутался...   -  person iJade    schedule 04.10.2011


Ответы (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;
                }
            }
        }
}

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

person Adrian Iftode    schedule 04.10.2011

Казалось бы, логика не совсем верна, так как:

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

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

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

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

person Antonio M    schedule 29.09.2016