【问题标题】:Two numbers, x and y, are from two different arrays. Find if there is a sum z such that z= x+y两个数字 x 和 y 来自两个不同的数组。求和 z 是否满足 z= x+y
【发布时间】:2011-02-07 05:23:19
【问题描述】:

需要补充的是,每个数组有n个整数,每个整数都在0到n^5之间。线性时间算法有没有办法解决这个问题?

【问题讨论】:

  • 这个问题作为stackoverflow.com/q/3987264的子问题解决
  • @codaddict:这个问题会给出一个 O(n*log(n)) 的解决方案,而不是 O(n)。 (第一步是排序。)
  • 按照问题的表述方式,解决方案是“将它们加在一起”。这里的问题到底是什么?
  • 问题还不清楚......你的z整数在第三个数组中,还是一个特定的z

标签: java algorithm complexity-theory performance


【解决方案1】:

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

  • 您的输入是(例如)32 位整数的数组。
  • 将两个整数相加是 O(1) 运算。
  • 您的计算机具有无限内存,读取内存中任意位置的字节是 O(1) 操作。

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

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

【讨论】:

  • 该算法平均时间为O(n),最差时间为O(n*n)。
  • @btilly:我已经写了我正在使用的假设。
  • 你不需要构造哈希表,只需要两个排序的数组和索引从一侧向上,第二个索引向下。这样,您就可以拥有可证明的线性时间。排序也需要线性时间,因为您知道上限并且可以使用基数排序。
  • @ralu O(n * k),k 仍然未知且可变,对于这种情况,基数排序不是线性的。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多