2015-09-04 102 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个星期!无论你打算如何处理它,这都是不可能的。

如果您试图找到一周的最佳时间表,您可以尝试制作一些贪婪的算法。