2016-06-21 80 views
1

我想我理解了排列組合與組合之間的區別:如何使用惰性評估來獲得數組的長度N個組合?

總之,[1,20,30].permutation(3).map(&:sort).uniq與​​相同。

我現在有一個計劃,得到所有的陣列的組合:

array = [1,20,30,40,50,60] 
1.upto(array.length).each do |combination_length| 
    array.combination(combination_length).each do |combination| 
    # ... do something here with the combination ... 
    end 
end 

我想減少內存消耗,我想我應該找到array.combination(combination_length).each替代。

Ruby docs for Lazy Enumerators似乎並不顯示combination方法。 Array#combination方法的來源是用C編寫的,所以我沒有真正的技能來改變它。

我特別試圖做的是爲array.combination結果的每個元素運行一個塊,但我不要想要首先加載所有長度爲N的組合。

我環顧四周,找到了我可以理解的combination的實現,但我遇到了困難。

回答

2

「我特別想做的是爲array.combination結果的每個元素運行一個塊,但我不想將所有長度爲N的組合加載到內存中。」

這正是你的代碼在做什麼。您正在調用combination方法而不使用塊,這會導致枚舉器。然後你使用它的each方法。一次只有一個組合在內存中。

+0

所以惰性評估是Enumerator對象的默認值? –

+0

一個非常呃..懶惰的程序員可以生成一個數組,並使用它的'each'方法,完全沒有使用Enumerator;但一般情況是,統計員是懶惰的。 – steenslag