【发布时间】:2015-03-10 18:14:50
【问题描述】:
给定子集 {1, 2, 3, .... N}。我必须找到一组从 1 到 N 的所有整数可以划分为两个总和相等的子集的方法数。
什么都没有想到。我想尝试“蛮力搜索”,但它可以限制时间。有什么快速算法吗?
【问题讨论】:
-
当您有一种特别简单的方法来定义整数序列时,您可能会尝试计算前几个值,然后自己识别它们或将它们输入整数序列在线百科全书。 oeis.org/…
给定子集 {1, 2, 3, .... N}。我必须找到一组从 1 到 N 的所有整数可以划分为两个总和相等的子集的方法数。
什么都没有想到。我想尝试“蛮力搜索”,但它可以限制时间。有什么快速算法吗?
【问题讨论】:
它可以在多项式时间内计算为从 1 到 n 的 (1 + x^k) 乘积中的 x^(n(n+1)/4) 的系数。有几种评估产品的方法;将术语一一相乘就足够了。
【讨论】:
我认为这个问题是 NP 难题,所以我认为您无法在多项式时间内找到最优解(除非 P=NP)。
编辑: 是的,正如我的继任者指出的那样,我在谈论更一般的集合二分问题,应该有一种简单的方法来找出每个可能的集合对。
【讨论】:
我不知道是否有纯粹的数学方法来解决这个问题,或者一些超级奇特的方法......但我的第一直觉是,既然你知道这些数字是连续的,那么在列表中的任何位置你都应该是能够说出到目前为止的总和是什么。因此,如果您选择对许多不应该出现的排列进行暴力破解,那么您应该能够做出一些明智的选择,以消除很多您需要检查的情况。
【讨论】:
分解问题...
想象一下,您只想找到总和为一个值的 2 个数字的子集。显然你可以在线性时间内做到这一点。例如,如果集合是 { 1, 2, 4, 7, 9 } 并且值为 11,那么从一端 (1) 开始,您从另一端倒退到 9(不匹配)。因此,现在您将底部数字索引增加一 (=2),它匹配 9。再次增加 (=4)。等等。这样做你只需要让 ONE 通过值列表。
当然,这只解决了问题的 2 成员子集部分。
所以,现在对 3 成员子集重复该过程。您可以使用完全相同的技术,除了使用 3 个游标而不是 2 个。依此类推...
我不知道作为游标数量函数的复杂性,它可能是 log N,但无论如何它都会比蛮力搜索快得多。如果是 log N,那么总复杂度就是 N log N,其中 N 是集合中元素的个数。
【讨论】: