В С++, в чем разница между разделяй и властвуй и разветвляй и присоединяйся? Является ли вилка и соединение особым случаем «разделяй и властвуй», потому что вилка и соединение применяются только в параллелизме? Спасибо!
разница разделяй и властвуй и разветвляйся и присоединяйся
Ответы (2)
По сути, Fork-Join разбивает задачу на мини-задачи до тех пор, пока мини-задача не станет достаточно простой, чтобы ее можно было решить без дальнейших разбивок. Это похоже на алгоритм «разделяй и властвуй». Одна важная концепция, которую следует отметить в этой структуре, заключается в том, что в идеале ни один рабочий поток не простаивает. Они реализуют алгоритм кражи работы, заключающийся в том, что бездействующие работники крадут работу у тех, кто занят.
Result solve(Problem problem)
{
if (problem is small)
directly solve problem
else
{
split problem into independent parts
fork new subtasks to solve each part
join all subtasks
compose result from subresults
}
}
В C++14 есть некоторые проблемы, связанные с fork & join , вы можете прочитать больше на этом сайте ( http://www.meetingcpp.com/index.php/br/items/a-look-at-c14-papers-part-2.html< /а> )
«Разделяй и властвуй» — это общий метод программирования для разбиения более крупной проблемы на более решаемые подзадачи, решения их по отдельности (а иногда и рекурсивно) и, наконец, получения ответа на большую проблему путем объединения ответов на подзадачи. Это идея, не относящаяся к C++.
«Разветвление» и «объединение» называют специфическими примитивами параллелизма, доступными на многих языках. "Fork" запускает другой поток выполнения; "join" заставляет текущий поток ожидать завершения и синхронизации другого потока. Я считаю, что стандарт С++ 14 имеет встроенные такие примитивы. Многие другие языки не имеют этого встроенного, но часто доступны через библиотеки (включая более ранние версии C++).
Можно использовать «Разветвление» и «Объединение» для реализации «Разделяй и властвуй», усиленного параллелизмом. При таком использовании «форк» отправляет потоки на отдельные подзадачи, а «объединение» необходимо как шаг, сигнализирующий о завершении подзадач. Но «объединение» специально не вычисляет комбинированный ответ на «большую» проблему. Вероятно, вам понадобится больше кода, чем просто разветвление и соединение.
join
,difference
иdivide
, так как выдержки из их тегов довольно четко определяют их как не имеющие отношения к вашей проблеме. Ну, кромеdivide
, а это просто плохой тег. Во-вторых, зависит ли это от языка или не зависит от языка? Если это последнее, пожалуйста, прямо укажите это. Если это первое, добавьте тег для языка. - person Fund Monica's Lawsuit   schedule 17.04.2015