分而治之和分叉和加入的区别

difference of divide and conquer & fork and join

本文关键字:区别 分叉 分而治之      更新时间:2023-10-16

在C++中,分而治之有什么区别;分叉和连接?fork和join是分而治之的特殊情况吗?因为fork和join只适用于并行性?谢谢

"分而治之"是一种通用的编程方法,用于将较大的问题分解为更可解的子问题,单独求解(有时递归求解),最后通过组合子问题的答案来产生大问题的答案。这是一个并非C++特有的想法。

"Fork"answers"Join"名称特定的并行原语在许多语言中可用。"Fork"导致启动另一个执行线程;"联接"使当前线程等待另一个线程完成并同步。我相信C++14标准内置了这样的基元。许多其他语言都没有内置这个功能,但它通常可以通过库(包括C++的早期版本)获得。

可以使用"Fork"answers"Join"来实现通过并行增强的"Divide and conquer"。像这样使用,"fork"将线程发送到单独的子程序块,而"join"作为子问题完成的一个步骤是必要的。但"联接"并没有具体计算出"大"问题的综合答案。您可能需要更多的代码,而不仅仅是fork和join。

基本上,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)