两个数字x和y来自两个不同的数组。找出是否存在和z,使得z = x + y

时间:2011-02-07 05:23:20

标签: java algorithm complexity-theory performance

我需要补充说每个数组中有n个整数,每个整数介于0和n ^ 5之间。有没有办法在线性时间算法中解决这个问题?

2 个答案:

答案 0 :(得分:2)

是的,在这些假设下,线性时间是可能的:

  • 您的输入是(例如)32位整数的数组。
  • 添加两个整数是O(1)操作。
  • 您的机器具有无限的内存,并且在内存中的任何位置读取字节都是O(1)操作。

1)将其中一个数组转换为哈希集,其查找时间复杂度约为O(1)。哈希集的构造大约需要线性时间。

2)迭代另一个数组,对于每个元素i,检查x-i是否在哈希集中。如果有匹配则(i,x - i)是一个解决方案。此步骤需要线性时间。

答案 1 :(得分:0)

我想不出线性时间算法,但我可以想到一个O(m log n)解决方案,其中m是较大列表的长度,n是较小列表的长度。

设n为较小列表的长度,m为较大列表的长度。

步骤1:对较小的列表进行排序(例如,合并排序):O(n log n) 步骤2:对于较大列表中的每个项目,尝试在排序列表中查找(目标号码 - 项目)。 如果找到匹配项,则表示您找到了要查找的两个数字。 O(m log n)。

复杂度为O(n log n)+ O(m log n),即O(m log n),因为m是较大的列表。