并行的极限(求职面试问题)

时间:2010-03-29 16:37:12

标签: theory big-o time-complexity

在给定无限数量的处理单元和无限空间的情况下,是否有可能在合理的时间内解决O(n!)复杂度问题?

O(n!)问题的典型例子是强力搜索:尝试所有排列(有序组合)。

10 个答案:

答案 0 :(得分:6)

确实如此。考虑一下严格的NP形式的旅行商问题:给出从每个点到另一个点旅行的成本列表,你能组合一个成本低于K的旅游吗?使用英特尔推出的新型无限核心CPU,您只需为每个可能的排列分配一个核心,并将成本加起来(这很快),并查看是否有任何核心成功。

更一般地说,NP中的问题是决策问题,使得可以在多项式时间(即,有效地)验证潜在的解决方案,并且因此(因为潜在的解决方案是可枚举的)任何这样的问题可以被充分有效地解决。很多CPU。

答案 1 :(得分:6)

听起来你真正想的是在非确定性机器上是否可以将O(n!)复杂度的问题减少到O(n ^ a);换句话说,Not-P = NP。这个问题的答案是否定的,有一些不是NP的Not-P问题。例如,一个有限的暂停问题(询问程序是否最多停止n步骤。)

答案 2 :(得分:2)

问题在于分发工作并收集结果。

如果所有CPU可以同时读取同一块内存,并且每个CPU都有一个已知的唯一CPU ID,那么该ID可用于选择排列,并且分发问题可以解决在不断的时间。

收集结果会很棘手。每个CPU可以与其(数字)邻居进行比较,然后将该结果与两个最近邻居的结果进行比较,等等。这将是O(log(n!))进程。我不确定,但我怀疑O(log(n!))是超多项式的,所以我不认为这是一个解决方案。

答案 3 :(得分:1)

如果问题是检查复杂性问题O(n!)的排列/答案,那么当然你可以使用无数个处理器来有效地完成它。

原因是您可以轻松地分配问题的原子部分(问题的原子部分可能是检查的排列之一),具有对数效率。

作为一个简单的例子,您可以将处理器设置为“二叉树”,可以这么说。您可能处于根目录,并让处理器将问题的排列(或问题的最小部分)提供给叶子处理器来解决,并且您最终会在log(n!)中解决问题时间。

请记住,这需要花费很长时间才能为处理器提供排列。问题的每个部分本身都会立即得到解决。

编辑:根据以下评论修正我的帖子。

答案 4 :(得分:1)

不,N!甚至高于NP。思考无限并行性可以解决多项式时间内的NP问题,这通常被认为是“合理的”时间复杂度,N!在这样的设置中,问题仍然高于多项式。

答案 5 :(得分:1)

您提到搜索是一个“典型”问题,但您是否真的被问到具体的搜索问题?如果是,那么是的,搜索通常是可并行化的,但据我所知,O(n!)原则上并不意味着可用的并发程度,是吗?你可能有一个完全串行的O(n!)问题,这意味着无限的计算机将无济于事。我曾经有一个不寻常的O(n ^ 4)问题,实际上是完全连续的。

所以,可用的并发性是第一件事,恕我直言,你应该在接受采访时获得提出阿姆达尔定律的要点。下一个潜在的缺陷是处理器间通信,并且通常是算法的性质。例如,考虑一下这个应用程序类列表:http://view.eecs.berkeley.edu/wiki/Dwarf_Mine。 FWIW我之前提到过的O(n ^ 4)代码属于FSM类别。

另一个有点相关的轶事:我听说一位超级计算机厂商的工程师声称,如果将10%的CPU时间用于MPI库,他们会认为并行化取得了巨大的成功(尽管这可能仅限于计算化学领域的代码。)

答案 6 :(得分:1)

这就像询问无数猴子在带有文字处理器的猴子破坏证明计算机上打字是否可以提出莎士比亚的所有作品;给予无限的时间。现实主义者会说,因为条件不可能。理想主义者会说是的;理论上它可以发生。由于软件工程(软件工程,而不是计算机科学)专注于我们可以看到和触摸的真实系统,那么答案是否定的。如果你怀疑我,那么去构建它并证明我错了! IMHO。

答案 7 :(得分:1)

有时候正确的答案是,“你的代码库有多少次?”但在这种情况下,有一个真正的答案。

正确答案是否定的,因为并非所有问题都可以使用完美的并行处理来解决。例如,一个类似旅行商的问题必须承担一条路径,以便考虑旅程的第二段。

假设一个完全连接的城市矩阵,如果你想为我们疲惫的推销员显示所有可能的非循环路线,你就会遇到O(n!)问题,可以将其分解为O(n) * O((n-1)!)问题。问题是你需要提交一条路径(在等式的O(n)侧),然后才能考虑剩余的路径(在等式的O((n-1)!)侧)。

由于某些计算必须在其他计算之前执行,因此无法在单个分散/聚集过程中完美地分散结果。这意味着解决方案将等待在“下一步”开始之前必须进行的计算结果。这是关键,因为对先前部分解决方案的需求为进行计算提供了“瓶颈”。

因为我们已经证明我们可以使这些无限快速,无限数量的CPU等待(即使它们在等待自己),我们知道运行时不能是O(1),我们只需要选择一个非常大的N来保证“不可接受的”运行时间。

答案 8 :(得分:0)

忽略设置的成本(例如,可能是......为处理单元分配一系列值),然后是。在这种情况下,可以在相同数量的处理单元的一个并发迭代中求解小于无穷大的任何值。

然而,

设置是一个值得忽视的重要事项。

答案 9 :(得分:0)

每个问题都可以由一个CPU解决,但是谁会将这些工作交给所有无限的CPU?一般来说,这个任务是集中的,所以如果我们有无限的工作要交付给所有无限的CPU,我们可以花费无限的时间来完成。