|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Вот такая функция, чесно стыренная с просторов интернета, решает задачу перестановок элементов массива Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
только на 10 элементах работает секунд 10 на моем компе, при этом процессор загружает только процентов на 12. Говорят что распаралеливание помогает загрузить проц на 100%. Но как его сюда приткнуть? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2018, 14:42 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
iskatelsql, Во первых, дай пример с тестом как тут принято. А имхо в том, что при рекурсии нельзя приткнуть. Только переписать полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2018, 16:12 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
iskatelsql, если у твоего процессора 8 ядер: то загрузив 1 ядро вы получите 100 / 8 = 12,5% попробуйте создать метод более высокого уровня, разбейте массив на 8 частей и проитерируйте их всех в разных потоках рекурсивно ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2018, 16:27 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Перестановки так просто не параллелятся. Недавно эту тему обсуждали, была у меня такая мысль: берем значение первого элемента, убираем его из массива и в N потоков делаем перестановки оставшихся, подставляя убранный на место по номеру потока. Коряво, но должно ускориться. В остальном, если ты на 10 не хочешь ограничиться, то учти что общее количество комбинаций N!, т.е. даже распараллеленный обсчет при N = 14 будет в 24024 раз дольше чем при N = 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2018, 17:40 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
iskatelsql, Параллелить рекурсию с lst.Add/Remove - плохая идея - блокировки убьют всю параллель... Я бы "копал" в эту сторону: как заметил Dima T "общее количество комбинаций N!", т.е., мы можем создать "массив" объектов нужного типа нужного размера, и, в зависимости от индекса объекта в массиве, "вычислять конфигурацию" перестановки в методе этого объекта (как это делать, навскидку не придумал). Ну и уже тогда к этому массиву задействовать AsParallel. Х.з., возможно, это и невозможно (придумать алгоритм вычисления перестановки по индексу), но я бы попытался... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:53 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
iskatelsql, есть теорема, что любая рекурсивная функция имеет нерекурсивное исполнение код конечно ужасен, руки надо отрубать за такое использование ресурсов ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 11:01 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Siemargl, Совершенно верно. Но автор ушел в несознанку и молчит. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 11:17 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
на хабре уже всё есть: https://habr.com/post/248493/ ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 11:56 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Вот реализация. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 15:18 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Отличный пример и памяти не жрёт совсем, так как это IEnumerable. Лучше конкатинацию (Concat) использовать, а не объединение (Union) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 15:35 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 18:55 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
Cat2, какой алгоритм? весь NP класс - полный перебор. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 19:09 |
|
Можно ли распаралелить рекурсивную функцию?
|
|||
---|---|---|---|
#18+
ViPRosCat2, какой алгоритм? весь NP класс - полный перебор. Если цель - сделать полный перебор, то да. Но в реальных задачах полный перебор применяется тогда, когда надо найти что-то оптимальное или единственное. Как правило хороший алгоритмист, которым я, увы, не являюсь, может найти ограничения, которые позволяют заранее отсекать тупиковые варианты и не делать полного перебора. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 19:46 |
|
|
start [/forum/topic.php?fid=20&fpage=25&tid=1399153]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 162ms |
0 / 0 |