2012-05-20 4 views
0

Я ищу эффективный метод для создания комбинации чисел во всех возможных сочетаниях. Итак, если бы у меня был общий список целых чисел (1 - 120), я бы хотел, чтобы на одном из результатов на самом деле было все 120 номеров в численном порядке от 1 до 120, и тогда мне понадобилась бы всякая другая комбинация, где эти числа были в разном порядке ,Создайте все возможные комбинации набора чисел в C#

+3

Вы нашли или разработали метод, который недостаточно эффективен для удовлетворения ваших требований? И требуйте помощи, уточняющей его (так, вероятно, следует опубликовать его) - Или это просто просьба «отправить отправить код»? –

+0

Количество перестановок будет высоким (а именно 120!) И, вероятно, потребуется несколько дней для повторения. – vidstige

+4

Вы понимаете, что есть 120! разные комбинации, правильно? На 1 миллион перестановок на наносекунду, которые все равно будут занимать 1,2e178 лет. – helloworld922

ответ

1

Ну, когда вы нашли способ быстро сделать это, пойдите и призовите нобелевскую премию.

Вы просто сломали каждый современный механизм шифрования, основанный на аналогичном primciple - тот факт, что вычисление всех возможных комбинаций двух (простых) nubmers невозможно быстро.

Если это домашнее задание, вы поднялись на шутку. если вы действительно думаете, что есть волшебный скрытый секрет, который мы вам не говорим, вы - живете в заблуждениях.

Извините, это одна из проблем, которые просто не имеют смысла.

Я ищу для эффективного метода

Определение эффективной. Самый эффективный метод, который я вижу сейчас, - это захват TON компьютеров и поиск его с грубой силой. NSA якобы может сделать это за 128 номеров в течение приемлемого периода времени;)

Альтернатива seonc, если у вас ограниченные деньги, - это время. Поместите небольшую машину с солнечной панелью где-нибудь и позвольте ей рассчитать какое-то время. Предположительно, в соответствии с одной истинной историей мира (как сказано в «Руководстве гитховцев о Галактике»), поэтому Земля существует - рассчитать вопрос до абсолютного ансвера, который равен 42.

ТРЕТИЙ путь - безусловно самый эффективный - просто использовать 42 как ответ.Если это подходит, вы только что нашли вопрос, если это не просто очередной провал.

К сожалению, я должен был сделать это несерьезным. Люди регулярно приходят с "простыми" математические вопросы, которые просто падают в факторизационный тип ловушки.

2

Для чего это необходимо, вот как это можно сделать для небольших диапазонов (например, 1-8) с использованием LINQ и рекурсии.

Если вы попытаетесь увеличить диапазон постепенно, вы поймете, почему этот подход не сработает.

static void Main(string[] args) 
{ 
    int[][] combinations = GetCombinations(8).Select(c => c.ToArray()).ToArray(); 
    string s = string.Join("\n", combinations.Select(c => string.Join(",", c))); 
    Console.WriteLine(s); 
} 

static IEnumerable<IEnumerable<int>> GetCombinations(int count) 
{ 
    return GetCombinations(Enumerable.Range(1, count)); 
} 

static IEnumerable<IEnumerable<int>> GetCombinations(IEnumerable<int> elements) 
{ 
    if (elements.Count() == 1) 
     return EnumerableSingle(elements); 

    return elements.SelectMany((element, index) => 
     GetCombinations(elements.ExceptAt(index)).Select(tail => 
      tail.Prepend(element))); 
} 

static IEnumerable<T> ExceptAt<T>(this IEnumerable<T> source, int index) 
{ 
    return source.Take(index).Concat(source.Skip(index + 1)); 
} 

static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element) 
{ 
    return EnumerableSingle(element).Concat(source); 
} 

static IEnumerable<T> EnumerableSingle<T>(T element) 
{ 
    return Enumerable.Repeat(element, 1); 
} 
Смежные вопросы