ruby - 组合所有组合以获得完整的集合
问题描述
我有一个数组:
arr = [1, 2, 3]
我想找到所有组合,然后组合组合以获得arr
仅包含一次的所有元素的数组。顺序无所谓。第一个组合应该返回类似
combis = [
[1], [2], [3],
[1, 2], [1, 3], [2, 3],
[1, 2, 3]
]
我需要valid
它的组合combis
包含arr
恰好一次的每个值。所以:
valid = [
[[1], [2], [3]],
[[1], [2, 3]],
[[2], [1, 3]],
[[3], [1, 2]],
[[1, 2, 3]]
]
这很快就会变大,所以我需要一种方法来做到这一点,而无需使用两次组合函数,然后过滤掉不正确的函数。
我觉得我需要使用某种树结构和递归来生成第二组组合,并在它不再是有效的最终组时停止遍历。
如果有人可以帮助我使用(伪)代码,那就太好了。
解决方案
用于Enumerator::Lazy
立即拒绝不需要/无效的组合:
combis = 1.upto(arr.size).each_with_object([]) do |i, acc|
acc.concat arr.combination(i).to_a
end
#⇒ [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
valid = 1.upto(arr.size).each_with_object([]) do |i, acc|
acc.concat(
# ⇓⇓⇓⇓ THIS
combis.combination(i).lazy.select do |e|
items = e.flatten
items.uniq.size == items.size && items | arr == items
end.to_a
)
end
#⇒ [[[1, 2, 3]], [[1], [2, 3]], [[2], [1, 3]], [[3], [1, 2]], [[1], [2], [3]]]
推荐阅读
- angularjs - 音频播放速率不适用于 AngularJS
- pandas - TfIdf 矢量化器为缺失的单词返回正值
- html - 如何使用条件禁用链接?
- android - Firebase API 和 Android 的活动生命周期
- java - SQSListener 与 ThreadpoolExecutor
- swift - CoreData:错误:API 滥用:在 NSFetchedResultsController 中使用 SectionNameKeyPath 时出错
- excel - 检查形状是否为组(GroupItems 引发错误)
- c++ - 如何调试这个 C++ 程序?
- javascript - 如何在单击事件期间淡入元素?
- python - 为列表中的单个字典提取值给定键