分而治之的问题



给定一个集合M,找出是否有一对数字(a,b),它们都属于M,并且a+b=x,其中x是以前指定的参数。这个问题应该使用O(n*logn)中的Divide et Impera来解决。可能应该将问题拆分为两个子问题,然后将结果重新组合为O(n)。

我想要一个给定问题的伪代码或解决它的技巧。

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

  1. 对集合进行Mergesort(这使用了分治)
  2. 从集合的第一个和最后一个元素开始,将它们的和与x进行比较。如果和相等,则完成。如果总和较大,则向下到倒数第二个元素;如果总和较小,则向上到第二个单元
  3. 重复第二步,从排序集的末端到中心,直到找到求和到x的元素,或者没有更多元素

分治排序是O(n-lgn),通过排序集的步进是O(n),因此总复杂度是O(nlg-n)。

Ed:求和到x,而不是M。

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

如果你不认为这将被视为D&I解决方案,您可以将检查步骤折叠到排序的组合步骤中,如果找到匹配项,则可以提前退出。

加法:如果你在联合过程中进行检查,你最终会做O(n-logn)加法和比较步骤,而不是O(n)——但当然,除了常数因子之外,这不会恶化渐近运行时间。

最新更新