【问题标题】:Can we do 4-sum algorithm in O(n^2)?我们可以在 O(n^2) 中进行 4-sum 算法吗?
【发布时间】:2018-09-12 20:21:33
【问题描述】:

这与以下问题有关:

https://cs.stackexchange.com/questions/2973/generalised-3sum-k-sum-problem

不失一般性,我们只考虑k,或者只考虑k = 4

我的问题是,在对所有数字求和之后,是否有必要对总和列表进行排序?我知道我们可以使用左右两个指针将两对夹在O(n^2)时间,但排序需要O(n^2 log(n))时间。

如果我们使用 hashmap 将总和存储为键,并将它们对应的索引对存储为值,那么所有操作都可以在O(n^2) 时间运行。

我在那篇帖子中遗漏了什么,或者即使kk-sum 也可以在O(n^{k/2}) 时间运行?

谢谢!

【问题讨论】:

  • 您要计算 4 和的数量还是打印四倍?
  • @Kaidul 我认为这两个应用程序的复杂性保持不变。但是假设我们要打印所有这样的 4 元组。
  • 不,如果要列出所有的四元组,复杂度会高很多
  • @Kaidul 在哈希图中,我们可以存储总和为数字的所有索引对的列表。然后我们只需要从两个这样的对中枚举四倍来将它们全部打印出来。这不应该增加复杂性。
  • @Kaa1el 假设所有 4 个四元组都满足条件,那么就有 O(n^4) 个这样的四元组

标签: algorithm hash time-complexity complexity-theory


【解决方案1】:

有一些微妙之处,但您是对的,决策问题的平均性能可以做得那么好。但是它需要两个哈希图,而不是一个。

第一个哈希图是从左边开始的,它将存储为值(i1, j1),其中i1 < j1j1 是可以达到该总和的最小索引。

第二个哈希图从右边开始,它将存储为值(i2, j2),其中i2 < j2i2 是可以达到该总和的最大索引。

现在遍历第一个 hashmap 的键,在另一个中寻找相反的键。如果两者都在那里并且j1 < i2 那么你有你的四倍。

但请注意一个微妙之处。排序预期和最坏情况的时间是O(n^2 log(n))。使用散列,您的预期时间是O(n^2),但如果您的散列算法出现故障,理论上可以得到O(n^4)。 (哈希算法在实践中通常不会中断,这就是为什么我们将它们视为 O(1)。)

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多