查找数组的所有键唯一排列

时间:2015-09-04 19:58:59

标签: arrays ruby permutation

我有一个看起来像这样的数组:

[["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 个答案:

答案 0 :(得分: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周!无论你打算用它做什么,它都是不可能的。

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