集合 {1, 2, 3, .. 的分区.N}.

Partition of set {1, 2, 3, ... N}

本文关键字:分区 集合      更新时间:2023-10-16

给定子集 {1, 2, 3, ....N}. 我必须找到从 1 到 N 的所有整数集合可以分成两个总和相等的子集的方法的数量。

我脑子里什么都没有。我想尝试"暴力搜索",但它可以设置时间限制。有没有快速算法?

它在

多项式时间内可计算为 x^(n(n+1)/4) 的系数,对于 k 从 1 到 n,在 (1 + x^k) 的乘积中。有几种方法可以评估产品;将术语一一相乘就足够了。

我认为问题是NP困难的,所以我认为你不能在多项式时间内找到最佳解决方案(除非P = NP)。

编辑:是的,正如我的继任者指出的那样,我谈论的是集合双分区的更普遍的问题,应该有一种简单的方法来找出每个可能的集合对。

我不知道

是否有纯粹的数学方法可以解决这个问题,或者有什么超级花哨的东西......但我的第一直觉是,既然你知道这些数字是连续的,那么在列表中的任何时候,你应该能够知道到那个点的总和是多少。因此,如果您选择在很多不应该可能的排列上暴力破解它,您应该能够做出一些明智的选择,以消除您需要检查的许多情况。

分解问题...

假设您想查找仅 2 个总和为一个值的数字的子集。显然,您可以在线性时间内执行此操作。例如,如果集合是 { 1, 2, 4, 7, 9 } 并且值是 11,那么从一端 (1) 开始,您从另一端向后走并到达 9(不匹配)。因此,现在您将底部数字索引递增 1 (=2),它与 9 匹配。再次递增 (=4)。等等。这样做,你只需要让一个通过值列表。

当然,这只能解决问题的 2 个成员子集部分。

因此,现在对 3 成员子集重复该过程。您可以使用完全相同的技术,只是使用 3 个游标而不是 2 个游标。等等...

我不知道游标数量的复杂性,它可能是log N,但无论如何它都会比蛮力搜索快得多。如果是对数 N,则总复杂度为 N log N,其中 N 是集合中元素的数量。