разница разделяй и властвуй раскошелиться

В C ++, в чем разница между разделяй и властвуй & развить и присоединиться? Является ли fork и join конкретным случаем разделяй и властвуй, потому что fork и join применяются только в параллелизме? Спасибо!

3

Решение

По сути, 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 & Присоединяйтесь, вы можете читать больше с этого сайта ( http://www.meetingcpp.com/index.php/br/items/a-look-at-c14-papers-part-2.html )

1

Другие решения

«Разделяй и властвуй» — это общий метод программирования, позволяющий разбить более крупную проблему на более разрешимые подзадачи, решить их по отдельности (а иногда и рекурсивно), в итоге получая ответ на большую проблему, комбинируя ответы на подзадачи. Эта идея не относится к C ++.

Примитивы параллелизма с именами «Fork» и «Join» доступны на многих языках. «Fork» вызывает запуск другого потока выполнения; «join» заставляет текущий поток ожидать завершения и синхронизации другого потока. Я считаю, что стандарт C ++ 14 имеет такие встроенные примитивы. Многие другие языки не имеют этого встроенного, но это часто доступно через библиотеки (включая более ранние версии C ++).

Можно использовать «Fork» и «Join» для реализации «Разделяй и властвуй», усиленного параллелизмом. При таком использовании «fork» отправляет потоки в отдельные подзадачи, а «join» необходим в качестве шага, сигнализирующего о завершении подзадач. Но «соединение» специально не вычисляет комбинированный ответ на «большую» проблему. Вам, вероятно, понадобится больше кода, чем просто разветвление и соединение.

2

По вопросам рекламы [email protected]