powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли распаралелить рекурсивную функцию?
13 сообщений из 13, страница 1 из 1
Можно ли распаралелить рекурсивную функцию?
    #39737934
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая функция, чесно стыренная с просторов интернета, решает задачу перестановок элементов массива

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public static List<List<T>> ShowAllCombinations<T>(IList<T> arr, List<List<T>> list = null, List<T> current = null)
        {
            if (list == null) list = new List<List<T>>();
            if (current == null) current = new List<T>();
            if (arr.Count == 0) 
            {
                list.Add(current);
                return list;
            }
            for (int i = 0; i < arr.Count; i++) 
            {
                List<T> lst = new List<T>(arr);
                lst.RemoveAt(i);
                var newlst = new List<T>(current);
                newlst.Add(arr[i]);
                ShowAllCombinations(lst, list, newlst);
            }
            return list;
        }



только на 10 элементах работает секунд 10 на моем компе, при этом процессор загружает только процентов на 12. Говорят что распаралеливание помогает загрузить проц на 100%. Но как его сюда приткнуть?
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39737952
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,
Во первых, дай пример с тестом как тут принято.
А имхо в том, что при рекурсии нельзя приткнуть.
Только переписать полностью.
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39737959
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

если у твоего процессора 8 ядер: то загрузив 1 ядро вы получите 100 / 8 = 12,5%
попробуйте создать метод более высокого уровня, разбейте массив на 8 частей и проитерируйте их всех в разных потоках рекурсивно
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39737981
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перестановки так просто не параллелятся.

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

В остальном, если ты на 10 не хочешь ограничиться, то учти что общее количество комбинаций N!, т.е. даже распараллеленный обсчет при N = 14 будет в 24024 раз дольше чем при N = 10.
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738304
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Параллелить рекурсию с lst.Add/Remove - плохая идея - блокировки убьют всю параллель... Я бы "копал" в эту сторону: как заметил Dima T "общее количество комбинаций N!", т.е., мы можем создать "массив" объектов нужного типа нужного размера, и, в зависимости от индекса объекта в массиве, "вычислять конфигурацию" перестановки в методе этого объекта (как это делать, навскидку не придумал). Ну и уже тогда к этому массиву задействовать AsParallel. Х.з., возможно, это и невозможно (придумать алгоритм вычисления перестановки по индексу), но я бы попытался...
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738396
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

есть теорема, что любая рекурсивная функция имеет нерекурсивное исполнение

код конечно ужасен, руки надо отрубать за такое использование ресурсов
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738414
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,
Совершенно верно. Но автор ушел в несознанку и молчит.
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738446
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на хабре уже всё есть:
https://habr.com/post/248493/
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738630
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот реализация.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list)

        {

            if (list.Count() == 1)

                return new List<IEnumerable<T>> { list };

 

            return list

                .Select((a, i1) => {

                    var res = Permute(list.Where((b, i2) => i2 != i1)).Select(c =>

                    {

                        var res1 = (new T[] { a }).Union(c);

                        return res1;

                    });

                    return res;

                })

                .SelectMany(c => c);

        }
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738640
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отличный пример и памяти не жрёт совсем, так как это IEnumerable.
Лучше конкатинацию (Concat) использовать, а не объединение (Union)
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738758
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Перестановки используют те, кто не может построить алгоритм без полного перебора! Например, я
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738763
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

какой алгоритм? весь NP класс - полный перебор.
...
Рейтинг: 0 / 0
Можно ли распаралелить рекурсивную функцию?
    #39738781
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ViPRosCat2,

какой алгоритм? весь NP класс - полный перебор.

Если цель - сделать полный перебор, то да.
Но в реальных задачах полный перебор применяется тогда, когда надо найти что-то оптимальное или единственное. Как правило хороший алгоритмист, которым я, увы, не являюсь, может найти ограничения, которые позволяют заранее отсекать тупиковые варианты и не делать полного перебора.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли распаралелить рекурсивную функцию?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]