问题描述
|
给定一个集合M,请查找是否存在一对均属于M且a + b = x的数字(a,b),其中x是先前指定的参数。该问题应使用O(n * log n)中的Divide et Impera解决。可能应将问题分成两个半个子问题,然后将结果重新组合为O(n)。
我想要给定问题的伪代码或解决它的技巧。
解决方法
不知道这是否符合您的要求,但是:
合并集合(使用分而治之)。
从集合的第一个和最后一个元素开始,并将它们的总和与x进行比较。如果总和相等,则完成。如果总和较大,则向下移动到第二个元素;如果总和较小,则向上移动到第二个元素。
重复第二步,从排序集的两端到中心,直到找到总和为x的元素,或者不再有其他元素。
分而治之排序为O(n lg n),逐步通过排序后的集合为O(n),因此总复杂度为O(n lg n)。
Ed:x的总和,而不是M。
, 如果对M进行排序(使用D&I在O(n log n)中进行排序),则可以在线性时间中检查是否存在一对正确的对。 (提示:两个指针)。
如果您不认为这将成为D&I解决方案,则可以将检查步骤折叠到合并的合并步骤中,如果找到匹配项,则尽早退出。
加法:如果在合并过程中进行检查,最终将执行O(n log n)的加和比较步骤,而不是O(n),但是当然,这不会使渐近运行时间恶化常数因子。