如何从哈希值中获取所有可能的组合

时间:2017-05-05 15:50:03

标签: ruby algorithm

我有这样的数组哈希:

ÌndexSearcher

我尝试使用以下形式构建一个包含所有可能值组合的数组,每个值来自不同的键值对:

{a: [1, 2], b: [3, 4]}

哈希可以有[{a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 3}, {a: 2, b: 4}] 个密钥,每个密钥可以有n个值 - 我不能假设任何数字。每个值(数组)可以具有不同的大小。以下也是有效的输入:

m

我得到的最好的是一个包含所有值排列但没有键的数组:

{a: [1, 2, 3], b: [4, 5, 6, 7], c: [8, 9, 10, 11, 12]}

我应该如何在Ruby中执行此操作?

3 个答案:

答案 0 :(得分:2)

a = { a: [1, 2], b: [3, 4], c: [5, 6] }
values = a.values
values.first.product(*values[1..-1]).map { |e| a.keys.zip(e).to_h }
#=> [{:a=>1, :b=>3, :c=>5}, {:a=>1, :b=>3, :c=>6}, 
#    {:a=>1, :b=>4, :c=>5}, {:a=>1, :b=>4, :c=>6}, 
#    {:a=>2, :b=>3, :c=>5}, {:a=>2, :b=>3, :c=>6}, 
#    {:a=>2, :b=>4, :c=>5}, {:a=>2, :b=>4, :c=>6}]

使用任何键计数的哈希值。

答案 1 :(得分:1)

基本计划:

从包含空哈希的数组开始。

每个键值对:将每个值的数组中的每个哈希映射到hash.merge({key=> value})的数组。拼合

对每个键重复

hash = {a: [1, 2], b: [3, 4]}
array = [{}]
hash.each_pair do |key, values|
  array.map! do |hash| 
    values.map do |value|
      hash.merge({key=> value})
    end
  end.flatten!
end

array
=> [{:a=>1, :b=>3}, {:a=>1, :b=>4}, {:a=>2, :b=>3}, {:a=>2, :b=>4}] 

可以使用更好的代码和可枚举方法的使用来清理,但这应该是您的一般想法。

答案 2 :(得分:0)

这取决于nm的值。如果这些常量具有 small 值-您可以制作,存储和使用实际的组合。当这些常量具有值时,则无法执行该操作。

请尝试使用OCG选项组合生成器。它不会存储任何组合,它可以用作单向迭代器。它可以处理数十亿种不同的组合。

require "ocg"

generator = OCG.new(
  a: 1..3,
  b: 4..7,
  c: 8..12
)

puts generator.next until generator.finished?

Generator包含更多功能,可帮助您处理其他选项。