【问题标题】:Which algorithm is best when running with parallel processors?使用并行处理器运行时哪种算法最好?
【发布时间】:2017-05-05 07:10:58
【问题描述】:
如果我有一台具有多个处理器的机器并试图解决一个巨大的问题,那么哪种算法最适合解决这个问题?
动态规划、贪心还是分治算法?
【问题讨论】:
标签:
algorithm
divide-and-conquer
【解决方案1】:
这是一个非常广泛的问题,很多事情取决于您要解决的具体问题,但您要寻找的是算法是否可以并行运行其步骤。只有当一个步骤的结果不依赖于另一个步骤的结果时,才能做到这一点。
- 这里我们不能说任何关于贪心算法的事情。它们仅被定义为采取当地最好的下一步。
- 分而治之将问题分成不同的部分,每个部分都可以单独解决,因此这通常是并行运行的理想选择。
- 可以将动态编程视为一种分而治之的方法,但现在,您要解决问题的一小部分,然后用它来解决更大的部分,等等。例如,背包问题经常被用作动态规划的用例。您可以从一个很小的背包开始解决问题,然后从那里构建您的解决方案。这里的问题是每个解决方案都取决于较小问题的解决方案。除非各个步骤可以在线程之间划分,否则无法并行化。
所以一般来说,分而治之似乎是并行运行的最佳选择。
【解决方案2】:
动态编程它使用一个数组,它必须在线程之间同步,这些线程正在寻找单独的解决方案。
贪婪是一种单线程。可以制作多线程,但不是一个巨大的优势imo。无论如何,您可以使用一个线程池来拍摄最好的 5 个匹配项……这将是最容易实现的。
分而治之是递归的。如果您要生成一个新线程,仍然需要同步,但它可以清楚地利用多处理器。我认为这将是实现多线程的第二种更简单的方法。
您需要解决的问题的性质将决定您应该使用哪种编程方法,而不是处理器核心数。
请考虑在线程之间切换上下文的时间成本!