【问题标题】:equal k subsets algorithm相等 k 子集算法
【发布时间】:2010-10-05 18:22:05
【问题描述】:

有没有人知道相等 k 子集算法的好且有效的算法?最好是可以处理 100 个元素的向量的 c 或 c++ 可能具有复杂性和时间估计

例如。 9元素向量

x = {2,4,5,6,8,9,11,13,14}

我需要生成总和 = 24 的所有 k=3 不相交子集 该算法应该检查是否有 k 个不相交的子集,每个子​​集的总和为 24,并按升序(在子集中和子集之间)列出它们,或者查看解决方案是否不存在

解决方案

解决方案 1:{2 8 14} {4 9 11} {5 6 13}

解决方案 2:{2 9 13} {4 6 14} {5 8 11}

谢谢

【问题讨论】:

  • k 是它已知的子集数,

标签: algorithm subset-sum


【解决方案1】:

不幸的是,受限于k-subset problem is a hard problem ...如果你想生成所有这样的k-子集,你别无选择,只能evaluate many possible candidates

您可以执行一些优化来减少搜索空间。

给定一个包含整数值的域x, 给定一个正整数目标 M, 给定子集的正整数 k 大小,

  1. 当 x 仅包含正整数并给定一个上限 M 时,从 x 中删除所有大于或等于 M 的项目。这些不可能是子集的一部分。
  2. 类似地,对于 k > 1、给定的 M 和包含正整数的 x,从 x 中删除所有大于 M + min0 + min1 ... minK 的项目。从本质上讲,删除所有不可能成为子集一部分的大值,因为即使选择小值,它们也会导致总和超过 M。
  3. 您还可以使用偶/奇排除原则来减少搜索空间。例如,k 是奇数,M 是偶数,你知道和将包含三个偶数或两个奇数和一个偶数。您可以使用此信息通过从 x 中消除可能是总和一部分的候选值来减少搜索空间。
  4. 对向量 x 进行排序 - 这使您可以快速排除不可能包含在总和中的值。

当向量 x 包含负值时,其中许多优化(偶数/奇数排除除外)不再有用/有效。在这种情况下,您几乎必须进行详尽的搜索。

正如 Jilles De Wit 指出的那样,如果 X 包含负数,您可以将 X 中最小值的绝对值添加到 X 的每个成员。这会将所有值移回正范围 -使我上面描述的一些优化再次成为可能。但是,这要求您能够准确地表示扩大范围内的正值。实现此目的的一种方法是在内部使用更广泛的类型(比如 long 而不是 int)来执行子集选择搜索。但是,如果您这样做,请记住在返回结果时将结果子集缩小相同的偏移量。

【讨论】:

  • 如果x 包含负数:您不能将x 中找到的最小值的绝对值添加到x 中的所有数字中,然后将M 中的项目数增加每个子集乘以该值以使一切再次变得积极?
  • @jilles de wit:实际上,是的——你可以做到这一点!当我把我的答案放在一起时,我没有想到这一点。我会更新这个想法。
  • 我想,他的意思是不。子集的大小不是子集的大小。
  • 排序有什么帮助?
  • @jillesdewit:我认为这个想法只有在每个子集都被限制为具有相同数量的元素时才有效——否则,如果一个子集的元素比另一个子集多 5 个,那么它的总和将包含 5M 以上“虚数单位”比另一个,意味着重新调整后会少5M。
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多