我们可以在O(n ^ 2)中做4和算法吗?

时间:2018-09-12 20:21:33

标签: algorithm hash time-complexity complexity-theory

这与以下问题有关:

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

在不失一般性的前提下,我们仅考虑k或仅考虑k = 4

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

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

我是否丢失了该帖子中的内容?或者kk的总和可以在O(n^{k/2})时间内运行吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

有些细微之处,但您是对的,可以使决策问题的平均性能达到最佳。但是,它需要两个哈希图,而不是一个。

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

第二个哈希图位于右侧,它将存储为值(i2, j2),其中i2 < j2i2是可以实现该总和的最大索引。

现在遍历第一个哈希图的键,在另一个图中查找相反的键。如果两者都在里面并且j1 < i2在里面,那么您就拥有了四倍。

但是请注意微妙之处。经过排序,预期和最坏情况的时间为O(n^2 log(n))。使用散列,您的预期时间为O(n^2),但是如果您的散列算法崩溃,理论上就有可能获得O(n^4)。 (哈希算法在实践中通常不会中断,这就是为什么我们将其视为O(1)。)