我创建了一个随机群组创建者,但随机并不能保证您与以前没有合作过的人一起工作。如果有人能够生成一个“跟踪历史记录的随机组生成器”来跟踪以前的组并且避免将人们一遍又一遍地组成相同的人群,我肯定会使用它!有谁知道怎么做?
为清楚起见:给定一个字符串数组
["Jason", "Kim", "Callie", "Luke"]
以及先前配对的数组(也是数组)
[[["Jason", "Kim"], ["Callie", "Luke"]], [["Jason", "Luke"], ["Callie", "Kim"]]]
返回重复组成员数最少的分组
[["Jason", "Callie"], ["Luke", "Kim"]]
我想象我想要最小化的数字是重复伴侣的数量。因此,对于每对两个人来说,每次他们已经在一个团队中,如果结果将他们放在同一个团队中,那么结果就会得分。例如,获得返回值的“得分”可能如下所示:
["Jason", "Kim"] have a score of 1, they have been paired together before
["Callie", "Luke"] have a score of 1, they have been paired together before
["Jason", "Luke"] have a score of 1, they have been paired together before
["Callie", "Kim"] have a score of 1, they have been paired together before
["Jason", "Callie"] have a score of 0, they have not been paired together before
["Luke", "Kim"] have a score of 0, they have not been paired together before
选择覆盖整个列表的集合,同时生成最小分数。在这种情况下,配对[“Jason”,“Callie”]和[“Luke”,“Kim”]覆盖整个集合,得分为0(没有重复分组),因此它是一个最佳解决方案(0是最好的结果)。
这可能是错误的方法(因为我想象它需要n平方时间),但希望它能让我了解我想要优化的内容。这不需要是一个完美的优化,只是一个“体面的答案”,不会每次都将相同的组合在一起。
理想情况下,它可以处理任何大小的组,并且还能够处理当天某人可能已经离开的事实(并非所有人都在所有阵列中)。我想要一个javascript答案,但如果有人能想出逻辑,我应该能够翻译。
答案 0 :(得分:2)
您可以收集对象中的所有配对并进行计数。然后只选择计数较小的那些。
function getKey(array) {
return array.slice().sort().join('|');
}
var strings = ["Jason", "Kim", "Callie", "Luke"],
data = [[["Jason", "Kim"], ["Callie", "Luke"]], [["Jason", "Luke"], ["Callie", "Kim"]]],
object = {},
i, j,
keys;
for (i = 0; i < strings.length - 1; i++) {
for (j = i + 1; j < strings.length; j++) {
object[getKey([strings[i], strings[j]])] = 0;
}
}
data.forEach(function (a) {
a.forEach(function (b, i) {
object[getKey(b)]++;
});
});
keys = Object.keys(object).sort(function (a, b) {
return object[b] - object[a];
});
keys.forEach(function (k) {
console.log(k, object[k]);
});
console.log(object);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;