查找未排序数组中的所有对(x,y),以便x + y = z

时间:2016-11-29 15:12:11

标签: algorithm sorting quicksort

我有n个数字和数字z。我想创建一个算法(伪代码)来查找是否有对(x,y),在O(nlogn)中x + y = z。

我以为我可以运行quicksort算法。然后我将有2个数组:array1(带元素< pivot)和array2(带元素> pivot)。 如果数组中的第一个元素是<那么我可以检查array1中的所有其他元素,找到x + y = z的对。 否则,如果array1中的第一个元素是> z,那么我将转到array2并执行相同的过程。 我的建议是真的吗?

3 个答案:

答案 0 :(得分:9)

首先,对数组进行排序 然后在排序数组的每一端设置一个指针/索引 如果它们总和为z,则保留它并将两个指针移向中间 如果总和小于z,则将小端上的指针移向中间 如果总和大于z,则将大端上的指针移向中间 当指针遇到/通过时,你已经完成了。

答案 1 :(得分:3)

使用数据透视的想法不会起作用,因为没有好的候选者用于数据透视,并且因为检查未分类的半范围将仍然是O(n)任务需要完成n / 2次, O(n 2 )的整体复杂性。

您可以在O(n)中执行此操作而不进行排序,方法是将所有元素添加到哈希表中,然后检查x元素也存在的每个元素z-xx=z/2的情况是一种特殊情况,因为您需要验证输入数组中是否存在两个z/2值。

答案 2 :(得分:2)

您无需对已排序的序列进行排序,只需进行搜索即可。

伪代码:

sort(sequence) // O(NlogN) sorts are well known
for element in sequence: // O(N) loop
    target = z - element // constant (assuming fixed size arithmetic)
    if target > min_element and target < max_element: // constant
        found = binary_search(target, sequence) // O(LogN) search

复杂性:O(NlogN(排序)+(N(循环)* LogN(搜索)))= O(NlogN),根据需要