【发布时间】:2015-07-02 20:44:35
【问题描述】:
我需要根据条件快速确定数组中元素的可能 uniq 组合。
它们具有以下结构:
[[id,parent_id]]
我对较小的数组没有任何问题。如果所有的 parent_id 都是唯一的。示例:
a = (1..6).to_a.map{ |a| [a,a] }
=> [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]
a.combination(3).size # => 20
立即回答。
如果我有重复出现 parent_ids 的 id,我仍然可以使用组合并遍历所有组合。
a = (1..7).to_a.map{ |a| [a,a] };a[6] = [7,6]
=> [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 6]]
a.combination(3).size # => 35
valid_combos = a.combination(3).to_a.select { |c| c.map(&:last).uniq.size == c.size }.size # => 30
这在小型阵列上仍然很快。但是,如果数组有 33 个条目和 1 个重复出现的 parent_id,我将不得不检查 1166803110 组合。这很慢。当然。
欢迎任何关于如何快速有效地解决此问题的想法或提示。
我喜欢 Array 类的组合方式。但我也会使用哈希或集合。
也可能有这样的数组:
a = [[1, 1], [2, 1], [3, 1], [4, 2], [5, 2], [6, 2], [7, 3], [8, 3]]
a.combination(3).size #=> 56
但只有 18 个是“有效的”。
感谢任何帮助。
编辑:
有效输入没有重复出现的parent_ids:
[[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]
每个组合 4 个的有效输出(5 个 uniq 组合):
[[[1, 1], [2, 2], [3, 3], [4, 4]], [[1, 1], [2, 2], [3, 3], [5, 5]], [[1, 1], [2, 2], [4, 4], [5, 5]], [[1, 1], [3, 3], [4, 4], [5, 5]], [[2, 2], [3, 3], [4, 4], [5, 5]]]
有效输入1重复出现的parent_ids:
[[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6,5]]
每个组合 4 个的有效输出(9 个 uniq 组合):
[[[1, 1], [2, 2], [3, 3], [4, 4]], [[1, 1], [2, 2], [3, 3], [5, 5]], [[1, 1], [2, 2], [3, 3], [6, 5]], [[1, 1], [2, 2], [4, 4], [5, 5]], [[1, 1], [2, 2], [4, 4], [6, 5]], [[1, 1], [3, 3], [4, 4], [5, 5]], [[1, 1], [3, 3], [4, 4], [6, 5]], [[2, 2], [3, 3], [4, 4], [5, 5]], [[2, 2], [3, 3], [4, 4], [6, 5]]]
这些是无效的组合 [5,5] 和 [6,5] 是不允许的:
[[[1, 1], [2, 2], [5, 5], [6, 5]], [[1, 1], [3, 3], [5, 5], [6, 5]], [[1, 1], [4, 4], [5, 5], [6, 5]], [[2, 2], [3, 3], [5, 5], [6, 5]], [[2, 2], [4, 4], [5, 5], [6, 5]], [[3, 3], [4, 4], [5, 5], [6, 5]]]
【问题讨论】:
-
请提供有效的输入和输出。似乎您正在寻找permutations,但我真的无法判断,因为这个问题有点令人困惑。
-
您必须检查的组合数量与 parent_id 的数量无关。使用 33 个数组元素,您只需检查 5456 combinations - 数量不多。
-
尽管我的解释技巧令人困惑,但它打破了这个问题:如何在非常大的数组上执行有效的选择?我不是在寻找排列。
-
@simonwo wolframalpha.com/input/?i=33C16 我有超过 10 亿个组合。
标签: arrays ruby combinations