Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Стоит задача - получить все возможные варианты сочетания строк. В целом - всё работает, но когда появляется большое количество начальных данных, то процесс падает с ошибкой 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);
       }
}
Миниатюры
Нажмите на изображение для увеличения
Название: 2019-07-31_00-44-50.png
Просмотров: 53
Размер:	34.2 Кб
ID:	97347  

Последний раз редактировалось TimeStopper; 30.07.2019 в 21:59.
TimeStopper вне форума   Ответить с цитированием
Старый 31.07.2019, 11:15   #2
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,267
Репутация: 646

icq: 359393755
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


14:22.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.