广义3SUM(k-SUM)问题?


29

所述3SUM问题试图识别3点的整数a,b,c从一组大小的使得。n a + b + c = 0Sna+b+c=0

据推测,没有比二次方更好的解决方案,即。或者换句话说:。on log n + n 2o(n2)o(nlog(n)+n2)

因此,我想知道这是否适用于广义问题:在大小为的集合为中的找到整数,使得。[ 1 .. ķ ] 小号Ñ Σ [ 1 .. ķ ]一个 = 0aii[1..k]Sni[1..k]ai=0

我认为您可以在针对(推广简单的k = 3算法很简单)。 但是对于k的其他值是否有更好的算法?ķ 2 ķ = 3 ķo(nlog(n)+nk1)k2k=3
ķ


关于3SUM的最新新闻/论文,探讨了其决策树复杂性的
下限

Answers:


27

k -SUM可以如下更快地求解。

  • 对于偶数:k计算k / 2个输入元素的所有和的排序列表检查S是否同时包含数字和。该算法以时间运行。Sk/2SxxO(nk/2logn)

  • 对于奇数k计算k 1 / 2个输入元素的所有和的排序列表S对于每个输入元件一个,检查是否小号同时含有X- 一个- X,对于一些数X。(第二步本质上是3SUM 的时间算法。)该算法以时间运行。(k1)/2aSxaxxO(n2)O(n(k+1)/2)

在线性决策树模型的某个弱但自然的限制条件下,对于任何常数,这两种算法都是最优的(可能为偶数且大于时的对数因子除外)。有关更多详细信息,请参见:k2k



1
散列是欺骗。对于整数输入,仅在使用适当的随机哈希函数的情况下,StackOverflow所描述的算法仅在O(n ^ 2)时间内运行以进行整数输入。我的答案中的算法在真实的RAM模型中运行,它们完全是确定性的,并且时间限制是最坏的情况。您也可以使用“位技巧”在整数设置中消除对数因子,但这有点无聊。
杰夫

12

-sum需要时间 Ñ Ω d ,除非K-SAT可要解决 2 ø Ñ 时间为任何常数k。Mihai Patrascu和Ryan Williams(1)的论文对此进行了说明。dnΩ(d)2o(n)

换句话说,假设指数时间假设为,则您的算法在指数的恒定因子(的多项式因子)之前是最优的n

(1)Mihai Patrascu和Ryan Williams。关于更快的SAT算法的可能性。进程 第21届ACM / SIAM离散算法研讨会(SODA2010)


3

这里有一些简单的观察。

对于,您可以通过扫描阵列零来在Θ n 时间内完成。对于k = 2,您无需在Θ n log n 时间内散列就可以做到这一点。对阵列进行排序,然后对其进行扫描。对于每一个元素为做一个二进制搜索- 。这导致Θ n log n )的总复杂度。对于k = n的情况,可以在Θ n )中进行k=1Θ(n)k=2Θ(nlogn)iiΘ(nlogn)k=nΘ(n) 通过累积数组并检查结果来确定时间。

有关更多参考,请参见3SUM的“开放问题项目”页面


-1

http://arxiv.org/abs/1407.4640

解决rSUM问题的新算法Valerii Sopin

抽象:

在某些情况下,提出了一种确定的算法来解决任何自然r的rSUM问题,并对时间复杂度进行了二次校正。就所使用的存储器量而言,所获得的算法还具有次二次阶。所获得算法的思想不是基于整数,而是二进制二进制系统中这些数字的k∈N个连续位。可以看出,如果整数之和等于零,则这些数字的任意k个连续位表示的数字之和必须足够“接近”于零。这样就可以丢弃数字,而这些数字并不能建立解决方案。

这是本期的新内容。


1
您能否明确引用文章中与该问题相关的结果?(如果文章从整体上讲是相关的,则可以粘贴摘要。)SE上的帖子应该不仅仅是链接。
FrankW

1
实际上,此答案是(可能有用的)注释,而不是答案。因此,它必须包含一些原始内容,例如,您用自己的语言描述算法。你想这样做吗?如果您不这样做,我可以将您的答案转换为评论。(我知道您无法代表您对此发表评论。)
拉斐尔

那看起来不像是可靠的文件。“时间复杂度在某些情况下是二次方的”的主张不是有用的陈述。根据定义,时间复杂度是最坏情况下的运行时间。气泡排序在某些情况下以线性时间运行,但是其时间复杂度仍然是二次的。
DW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.