Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2019, 20:45   #1
TimeStopper
Пользователь
 
Регистрация: 11.09.2012
Сообщений: 44
По умолчанию Помогите оптимизировать рекурсивный алгоритм

Стоит задача - получить все возможные варианты сочетания строк. В целом - всё работает, но когда появляется большое количество начальных данных, то процесс падает с ошибкой OutOfMemoryException.
Что можно придумать?

Код:
var lllMatrix1 = new List<List<List<int>>>()
{
    new List<List<int>>() {
        new List<int> { 1, 1, 1},
        new List<int> { 2, 2, 2},
        new List<int> { 3, 3, 3}
    },
        new List<List<int>>() {
        new List<int> { 4, 4, 4},
        new List<int> { 5, 5, 5},
        new List<int> { 6, 6, 6}
    },
    new List<List<int>>() {
        new List<int> { 7, 7, 7},
        new List<int> { 8, 8, 8},
        new List<int> { 9, 9, 9}
    },
};

public static List<List<List<int>>> FindAllVariant(List<List<List<int>>> lllMatrix)
{
       var result = new List<List<List<int>>>();
       MakeNewVariant(lllMatrix, 0, result, new List<List<int>>());
       return result;
}

public static void MakeNewVariant(List<List<List<int>>> lllMatrix, int position, List<List<List<int>>> result, List<List<int>> lVariant)
{
       var lVariantCopy = new List<List<int>>(lVariant);
       if (lVariantCopy.Count == lllMatrix.Count)
       {
           result.Add(lVariantCopy);
           return;
       }
       for (int i = 0; i < lllMatrix.Count; i++)  
       {
           if (position + 1 > lVariantCopy.Count)
               lVariantCopy.Add(lllMatrix[position][i]);
           else
               lVariantCopy[position] = lllMatrix[position][i];
           MakeNewVariant(lllMatrix, position + 1, result, lVariantCopy);
       }
}
Изображения
Тип файла: png 2019-07-31_00-44-50.png (34.2 Кб, 128 просмотров)

Последний раз редактировалось TimeStopper; 30.07.2019 в 20:59.
TimeStopper вне форума Ответить с цитированием
Старый 31.07.2019, 10:15   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Так ежу понятно что памяти не хватит. Еще и со строками. Вам нужно через файл видимо все делать. Что крайне долго и муторно. Еще и листы везде используете которые сами по себе достаточно много памяти кушают.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивный алгоритм Дюша Метелкин Паскаль, Turbo Pascal, PascalABC.NET 20 13.04.2016 02:16
рекурсивный алгоритм. Nelson1992 Помощь студентам 9 21.03.2010 12:09
Рекурсивный алгоритм SVM Общие вопросы C/C++ 7 13.11.2009 09:24
Разработать рекурсивный алгоритм lucky Паскаль, Turbo Pascal, PascalABC.NET 4 08.05.2009 15:04