2016-02-27 28 views
-1

我目前有一个非常大的排列阵列,目前使用大量的RAM。这是我现在的代码应该是:优化阵列内存使用

除了在一行中存在多于一个“1”或三个“2”的情况之外的所有事件。

arr = [*1..3].repeated_permutation(30).to_a; 

count = 0 

arr.each do |x| 
    if not x.join('').include? '222' and x.count(1) < 2 
     count += 1 
    end 
end 

print count 

所以基本上这样会产生24,360个元素数组,每个数组有30个元素。

我试图通过终端运行它,但它实际上通过14GB的RAM吃了,并没有移动15分钟,所以我不知道该过程是否试图访问更多的RAM冻结,或者如果它仍在计算。

我的问题是:有没有更快的方式做到这一点?

谢谢!

+0

不清楚。 ..... – sawa

+0

需要澄清的是什么?我会很乐意详细说明! – Caleb

+1

您需要编辑您的问题以包含示例。显示所需的输出,例如'arr = [[1,3,3,2,2],[4,1,1,1,2],[5,1,3,1,1]]''。确保包含一个变量(这里是'arr'),其值是输入数组,因此可以在答案和注释中引用它。 –

回答

1

我不确定你尝试解决什么问题。如果你的代码仅仅是一个更复杂的问题的例子,你真的需要以编程方式检查每一个permumation,那么你可能要与lazy实验:

[*1..3].repeated_permutation(30).lazy.each do || 
    # your condition 
end 

或者你可能想使嵌套iteratior非常明确:

[1,2,3].each do |x1| 
    [1,2,3].each do |x2| 
    [1,2,3].each do |x3| 
     # ... 
     [1,2,3].each do |x30| 
      permutation = [x1,x2,x3, ... , x30] 
      # your condition 
     end 
     end 
    end 
    end 
end 

但是我觉得用Ruby枚举来解决这类问题感觉不对。让我们看看你的字符串:

111111111111111111111111111111 
111111111111111111111111111112 
111111111111111111111111111113 
111111111111111111111111111121 
111111111111111111111111111122 
111111111111111111111111111123 
111111111111111111111111111131 
... 
333333333333333333333333333323 
333333333333333333333333333331 
333333333333333333333333333332 
333333333333333333333333333333 

我建议只使用enumerative combinatorics。只要看看模式并分析(或计算)您的情况可能会多久出现true。例如,在字符串中有28个索引,子字符串可以放在222的子字符串中,只有27个子字符串可以放在2222子字符串中。如果放置子字符串,字符串的其他部分中可能没有1

我认为你的问题是一个数学问题,而不是编程问题。

+0

您的最后一行是非常好的一点。 –

0

NB这是一个不完整的答案,但我认为这个想法可能会推动正确的解决方案。

我能想到的以下方法:让我们代表每个置换为三元基数的值,通过零填充:

1 = 000..00001 
2 = 000..00002 
3 = 000..00010 
4 = 000..00011 
5 = 000..00012 
... 

现在考虑我们重申原来的任务,处理零作为的,一两三三。到现在为止还挺好。

排列的整个列表将被表示为:

(1..3**30-1).map { |e| x = e.to_s(3).rjust(30, '0') } 

现在我们申请的条件:

def do_calc permutation_count 
(1..3**permutation_count-1).inject do |memo, e| 
    x = e.to_s(3).rjust(permutation_count, '0') 
    !x.include?('111') && x.count('0') < 2 ? memo + 1 : memo 
end 

不幸的是,即使是permutation_count == 20它需要超过5分钟来计算,所以可能需要一些额外的步骤。我会考虑进一步优化。目前我希望这会给你一个提示,找到自己的好方法。