除以问题

时间:2011-05-30 11:16:50

标签: algorithm language-agnostic divide-and-conquer

给定集合M,找出是否存在一对数字(a,b),两者都属于M,并且a + b = x,其中x是先前指定的参数。问题应该使用Divide et Impera in O(n * log n)来解决。可能问题应该分成两个半尺寸的子问题,然后将结果重新组合为O(n)。

我想要一个针对给定问题的伪代码或解决它的提示。

2 个答案:

答案 0 :(得分:3)

不确定这是否符合您的要求,但是:

  1. 合并集合(这使用分而治之)。
  2. 从集合的第一个和最后一个元素开始,并将它们的总和与x进行比较。如果总和相等,那么你就完成了。如果总和较大,则降低到倒数第二个元素,如果总和较小,则升级到第二个元素。
  3. 重复第二步,从有序集合的末端到中心工作,直到找到与x相加的元素,或者没有更多元素。
  4. 分而治之的排序是O(n lg n),通过排序集的步进是O(n),因此总复杂度为O(n lg n)。

    Ed:总和到x,而不是M.

答案 1 :(得分:2)

如果你排序M(在O(n log n)中,使用D& I),你可以检查线性时间是否有一对正确的和。 (提示:两个指针)。

如果您认为这不会算作D& I解决方案,您可以将检查步骤折叠到排序的合并步骤,如果找到匹配则提前退出。

增加:如果你在组合期间进行检查,你最终会做O(n log n)加法和比较步骤而不是O(n) - 但是当然这不会使渐近运行时间恶化,除了对于常数因素。