这与以下问题有关:
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)
时间运行。
我是否丢失了该帖子中的内容?或者k
,k
的总和可以在O(n^{k/2})
时间内运行吗?
谢谢!
答案 0 :(得分:2)
有些细微之处,但您是对的,可以使决策问题的平均性能达到最佳。但是,它需要两个哈希图,而不是一个。
第一个哈希图是从左侧开始的,它将存储为值(i1, j1)
,其中i1 < j1
和j1
是可实现该总和的最小索引。
第二个哈希图位于右侧,它将存储为值(i2, j2)
,其中i2 < j2
和i2
是可以实现该总和的最大索引。
现在遍历第一个哈希图的键,在另一个图中查找相反的键。如果两者都在里面并且j1 < i2
在里面,那么您就拥有了四倍。
但是请注意微妙之处。经过排序,预期和最坏情况的时间为O(n^2 log(n))
。使用散列,您的预期时间为O(n^2)
,但是如果您的散列算法崩溃,理论上就有可能获得O(n^4)
。 (哈希算法在实践中通常不会中断,这就是为什么我们将其视为O(1)
。)