2015-09-04 105 views
2

的所有關鍵唯一的排列我有一個數組,看起來是這樣的:查找陣列

[["Sunday", [user1, user2]], ["Sunday", [user1, user4]], ["Monday", [user3, user2]]] 

陣列實質上具有唯一的一對用戶的某一天的所有排列。我通過運行獲得它

%w[Su Mo Tu We Th Fr Sa].product(User.all_pairs) 

其中User.all_pairs是每一對唯一的用戶。

我現在的目標是將這組嵌套數組組合到計劃中,這意味着我想要找到每個長度爲7的獨特日子的排列。換句話說,我希望每一個潛在的一週。我已經有了每一天的潛力,而且我擁有所有潛在的用戶,現在我只需要撰寫它們。

我有一個預感,Array.permutation方法是我所需要的,但我不知道如何在這種情況下使用它。或者我應該使用Array.product

回答

1

如果我正確理解你,你希望所有可能的幾周有一對用戶分配給每一天。你可以這樣做:

User.all_pairs.combination(7) 

這將給你所有可能的方式,你如何挑選7對並將它們分配到星期幾。但是,如果你問每一個可能的一週,那麼它也很重要到哪一天是對分配的,你還必須把這些7對每種排列:

User.all_pairs.combination(7).map{|week| week.permutation().to_a}.flatten(1) 

現在,這會給你一切可能的周,其中每週表示爲包含7對的數組。例如,周的一個可能看起來像這樣:

[(user1, user2), (user1, user3), (user2, user3), (user3, user4), (user1, user4), (user2, user4), (user3, user4)] 

然而周的量將是巨大的!如果你有n用戶,你將有k = n!/2對,有p = k!/(7! * (k - 7)!)方式選擇7對和p * 7!可能幾周。如果你只有5個用戶,你可能會得到1946482876800個星期!無論你打算如何處理它,這都是不可能的。

如果您試圖找到一週的最佳時間表,您可以嘗試製作一些貪婪的算法。