用于检查2个数组中的数字是否加到给定数字

时间:2016-05-06 06:52:18

标签: arrays algorithm

我想知道什么是最耗时的算法。

  

给定2个数组,ab,检查是否有2个成员 - 一个来自a,另一个来自b加起来给定的数字h

您认为这个问题的最快算法是什么?我只是简单地遍历两个阵列并试图找到非常昂贵的解决方案。我认为它是O(mn),其中mn分别是数组ab的长度。而且,两个阵列都没有必要具有相同的长度。你知道比这更快的算法吗?对于大小,请考虑两个阵列的最大长度约为100000。

感谢。

P.S。这个问题并不重复,因为它涉及在两个不同的数组中找到整数,而不是一个。

3 个答案:

答案 0 :(得分:3)

您可以对两个数组中的一个进行排序,比如数组b,然后遍历数组a。对于a中的每个元素,使用二分搜索在b中找到"匹配"的元素,即添加到h。然后,排序的复杂度为O(n log n),迭代和二分搜索的复杂度为O(m log n)

答案 1 :(得分:2)

作为启发式改进,可以预先对数组进行排序。

如果n为非负,请按非递增顺序对数组AB进行排序。假设外部循环以此排序顺序迭代第一个数组,并且内部循环以此排序顺序迭代第二个数组,分别考虑求和ab。只要a+b小于n,就可以终止内循环的迭代。

同样,如果n为负数,则可以按非递减顺序对数组进行排序; a+b大于n时,内循环可以终止。

然而,这并没有减少最坏情况下的时间复杂度,因为在最坏的情况下,仍然会检查输入中的每对数字。

答案 2 :(得分:0)

您可以使用奇数/偶数来大致减半时间:

将a和b分成2个数组,分别为aeven,aodd,beven,bodd。如果n是偶数,则比较(aeven + beven)和(aodd + bodd)。如果n是奇数,则比较(aeven + bodd)和(aodd + beven)。

因此,如果| a | = 20,| b | = 20,那么您将进行400次测试。如果我们假设每个数组中的奇数和平均数大致相同,那么| aeven | (和其他子阵列)将是大约10,所以你将有10 * 10 + 10 * 10测试,或大约200。

当然,加上数组并在总和大于n时停止测试第一个数组中的每个值。