2016-02-27 57 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分鐘來計算,所以可能需要一些額外的步驟。我會考慮進一步優化。目前我希望這會給你一個提示,找到自己的好方法。