运行 个并行处理器时哪种算法最好?
Which algorithm is best when running with parallel processors?
如果我有一台多处理器的机器并试图解决一个巨大的问题,哪种算法最适合解决这个问题?
动态规划,贪心算法还是分而治之算法?
动态编程它使用一个数组,它必须在线程之间同步,线程正在搜索单独的解决方案。
Greedy 是单线程的。可以做成多线程,但在我看来并不是一个巨大的优势。不管怎样,你可以使用一个线程池来拍摄最好的 5 场比赛......这将是最容易实现的。
分而治之是递归的。如果你要产生一个新线程仍然需要同步,但它可以明显地利用多处理器的优势。我认为这将是实现多线程的第二种更简单的方法。
您需要解决的问题的性质将决定您应该使用哪种编程方法,而不是处理器核心数量。
请同时考虑在线程之间切换上下文的时间成本!
这是一个非常宽泛的问题,很多事情都取决于您要解决的具体问题,但您要寻找的是算法是否可以 运行 它的步骤并行进行。仅当一个步骤的结果不依赖于另一步骤的结果时才能这样做。
- 我们不能在这里谈论贪心算法。他们只被定义为采取当地最好的下一步。
- 分而治之将问题分成不同的部分,每个部分都可以单独解决,因此这通常是 运行并行处理问题的好选择。
- 动态编程可以被视为一种分而治之,但现在,您正在解决问题的一小部分,然后用它来解决更大的部分,依此类推。例如,背包问题经常被用作动态规划的用例。您可以从一个非常小的背包开始解决问题,然后从那里构建您的解决方案。这里的问题是每个解决方案都取决于较小问题的解决方案。除非各个步骤可以在线程之间划分,否则无法并行化。
所以一般来说,分而治之似乎是 运行并行处理事物的最佳选择。
如果我有一台多处理器的机器并试图解决一个巨大的问题,哪种算法最适合解决这个问题?
动态规划,贪心算法还是分而治之算法?
动态编程它使用一个数组,它必须在线程之间同步,线程正在搜索单独的解决方案。
Greedy 是单线程的。可以做成多线程,但在我看来并不是一个巨大的优势。不管怎样,你可以使用一个线程池来拍摄最好的 5 场比赛......这将是最容易实现的。
分而治之是递归的。如果你要产生一个新线程仍然需要同步,但它可以明显地利用多处理器的优势。我认为这将是实现多线程的第二种更简单的方法。
您需要解决的问题的性质将决定您应该使用哪种编程方法,而不是处理器核心数量。
请同时考虑在线程之间切换上下文的时间成本!
这是一个非常宽泛的问题,很多事情都取决于您要解决的具体问题,但您要寻找的是算法是否可以 运行 它的步骤并行进行。仅当一个步骤的结果不依赖于另一步骤的结果时才能这样做。
- 我们不能在这里谈论贪心算法。他们只被定义为采取当地最好的下一步。
- 分而治之将问题分成不同的部分,每个部分都可以单独解决,因此这通常是 运行并行处理问题的好选择。
- 动态编程可以被视为一种分而治之,但现在,您正在解决问题的一小部分,然后用它来解决更大的部分,依此类推。例如,背包问题经常被用作动态规划的用例。您可以从一个非常小的背包开始解决问题,然后从那里构建您的解决方案。这里的问题是每个解决方案都取决于较小问题的解决方案。除非各个步骤可以在线程之间划分,否则无法并行化。
所以一般来说,分而治之似乎是 运行并行处理事物的最佳选择。