Я хочу получить список всех возможных комбинаций с повторением.Получить все комбинации элементов k с повторением
например.
Input: 1,2,3
Result: 111,112,...,332,333
для этого я использую this модифицированный метод, который работает отлично
public static IEnumerable<IEnumerable<T>> CombinationsWithRepeat<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } : elements.SelectMany((e, i) => elements.CombinationsWithRepeat(k - 1).Select(c => (new[] { e }).Concat(c)));
}
моя проблема заключается в использовании памяти этого рекурсивного подхода. При вводе 60 элементов и K = 4 уже есть Out Of Memory Exception
.
мне нужно запустить это с K = 10.
Вопрос: Есть ли простой способ избежать этого исключения? Нужен ли итеративный подход?
Update:
со ссылкой на комментарий Corak в - K должен быть динамичным
это должно работать с 60 элементами и K = 10
, но это не динамический.
StreamWriter sr = new StreamWriter(@"c:\temp.dat");
List<char> cList = new List<char>() { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
for (int i = 0; i < cList.Count; i++)
for (int j = 0; j < cList.Count; j++)
for (int k = 0; k < cList.Count; k++)
sr.WriteLine(cList[i] + cList[j] + cList[k]);
Устанавливается ли 'K = 10'? Если да, попробовали ли вы 10 вложенных циклов (уродливые, но могли бы работать)? – Corak
@Corak - no 'K' также может быть другим числом - эта часть должна быть динамической – fubo
Возможно, поиск через http://ericlippert.com/tag/permutations/ поможет. Вам нужно будет адаптировать 'TinySet' от' Int32' к 'Int64' для хранения ваших точек данных, но в противном случае он мог бы просто произвести все 604661760000000000 предметов ... – Corak