【问题标题】:Find all possibilities of bin and objects找到 bin 和 objects 的所有可能性
【发布时间】:2015-03-06 22:51:56
【问题描述】:

给定一组有限的 bin 和对象,其中 bin 的大小是无限的(它们可以容纳的对象数量没有限制。计算 bin 中对象的所有可能性的有效算法是什么?

p>

例如:

假设我们有垃圾箱:B1、B2 和对象 O1、O2,解决方案将是:

B1 => [O1, O2] 
B2 => []

B1 => []
B2 => [O1, O2]

B1 => [O2]
B2 => [O1]

B1 => [O1]
B2 => [O2]

【问题讨论】:

  • 产生所有可能性的算法不同于计算它们的算法。
  • 在这种情况下,find、produce 和compute 这三个词的意思是一样的
  • 你确定需要递归吗?
  • 我不确定,我想我还是会标记它
  • 总组合是 bin 数量的对象数量的幂,否则 B^O。这是一个简单的封闭式解决方案。

标签: algorithm recursion combinations


【解决方案1】:

假设 B 是 bin 的数量,O 是对象的数量。该算法应该只计算 base-B(而不是 base-10 或 base-2),从 0B 计数到 AA...AAB,其中 @ 987654321@,位数为O。

在base-B中计数的最简单方法是拥有一个长度为O的数组。在每一步中将...XAA..AA转换为...Y00..00,其中X < AY = X + 1, AA..AA 部分的长度甚至可以为零。尽可能长时间地重复。转换子数组的最简单方法是运行内部循环,该循环从数组的一端运行,以模 B 递增项目,并在递增后第一个不为零的项目之后停止,或者在另一端停止数组。

对每一步数组内容的解读是,每个O位数字告诉我们On位于哪个bin对象。

【讨论】:

  • 我想你可能有一些东西,但你能不能更正式地使用你的变量?我很难理解。比如你说“数字个数等于O”在这种情况下是O对象的个数吗?
  • @ErikPetersen 正确。我扩大了答案。
【解决方案2】:

根据我的理解,一个简单的解决方案可以是:

假设我们有两个垃圾箱(根据您提到的解决方案):

B1 => [O1, O2] 
B2 => []

这意味着,B1 有 2 个对象,B2 是空的,所以 1 因为 2^0 = 1

总计 = 3 可能性总数 = 2^3 = 8

合并所有的 bin,如果你使用 add all(不确定它的复杂性是什么,但你可以看看 Collections.addAll [特别是 java,会有其他更复杂的算法来合并两个或多个数组])然后您可以使用此处提到的算法在 O(n!) 中找到 N 个元素的所有组合。

Best way to find all combinations

【讨论】:

  • 计算可能性的数量不是问题,我想要实际的可能性
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多