【发布时间】:2013-07-27 14:07:23
【问题描述】:
我有一组 N,对于 N>3,不同的整数,问题是找到给定集合的 3 个子集的所有不同和。 3 子集是基数为 3 的子集。
我知道愚蠢的方法是对所有可能的总和进行三次搜索,然后对所有重复项进行排序。有没有更有效的方法来做到这一点?我正在用 C 语言编程。
编辑:如果元素数量增加,我想知道一个通用的更快算法。
【问题讨论】:
-
如果你只有 8 个整数,三次搜索会很快。为什么你需要为这么少的元素提供更好的东西?
-
不是骗子,而是相关的:Sum-subset with a fixed subset size。请注意,找到所有非固定大小的子集总和是 NP-Complete [更正:NP-Hard]。
-
亲密选民:这个问题有什么问题?算法问题非常好并且符合主题。不仅是“如何在 C 中解析字符串?”适合 SO 的问题,这些也非常好,因为在算法建立后,它可以很容易地用任何编程语言编程。
-
天真的解决方案并不完全是立方时间,而是有点困难:O(N^3 * log N):我们需要对重复项进行排序,这就是 O(N^3 * log (N^3)) 出现。问题是我们是否可以在 O(N^3) 中实现(因为我们当然不能让它比 O(N^3) 更快,因为 O(N^3) 是 3-subsets 的数量)。
-
如果你想找到 3 个子集的所有不同的和,那么复杂度至少是不同和的数量(因为我们需要找到并输出它们中的每一个),这是 O (N^3) 在最坏的情况下。如果您只想找到不同总和的数量,那会改变问题(但我不确定这是否会简化它)。