繁体   English   中英

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

[英]Find all pairs (x, y) in an unsorted array so that x + y = z

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

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

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

具有枢轴的想法行不通,因为没有合适的枢轴候选者,并且因为检查总排序复杂度,检查未排序的半范围仍将是O(n)任务,需要完成n / 2次的O(n 2 )。

通过将所有元素添加到哈希表中,然后检查每个元素x是否还存在zx元素,可以在O(n)中进行排序而不进行排序。 x=z/2的情况是一种特殊情况,因为您需要验证输入数组中是否存在两个z/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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM