我想知道什么是最耗时的算法。
给定2个数组,
a
和b
,检查是否有2个成员 - 一个来自a
,另一个来自b
加起来给定的数字h
您认为这个问题的最快算法是什么?我只是简单地遍历两个阵列并试图找到非常昂贵的解决方案。我认为它是O(mn)
,其中m
和n
分别是数组a
和b
的长度。而且,两个阵列都没有必要具有相同的长度。你知道比这更快的算法吗?对于大小,请考虑两个阵列的最大长度约为100000。
感谢。
P.S。这个问题并不重复,因为它涉及在两个不同的数组中找到整数,而不是一个。
答案 0 :(得分:3)
您可以对两个数组中的一个进行排序,比如数组b
,然后遍历数组a
。对于a
中的每个元素,使用二分搜索在b
中找到"匹配"的元素,即添加到h
。然后,排序的复杂度为O(n log n)
,迭代和二分搜索的复杂度为O(m log n)
。
答案 1 :(得分:2)
作为启发式改进,可以预先对数组进行排序。
如果n
为非负,请按非递增顺序对数组A
和B
进行排序。假设外部循环以此排序顺序迭代第一个数组,并且内部循环以此排序顺序迭代第二个数组,分别考虑求和a
和b
。只要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时停止测试第一个数组中的每个值。