创建组而不重复以前的分组
Create Groups Without Repeating Previous Groupings
我创建了一个随机组创建者,但随机并不能真正保证您与以前从未合作过的人一起工作。如果有人能够生成一个 "Random Group Generator With History" 来跟踪以前的组并避免将人们一遍又一遍地放在同一组中,我肯定会使用它!有人知道怎么做吗?
为清楚起见:给定一个字符串数组
["Jason", "Kim", "Callie", "Luke"]
和一组先前的配对(也是数组)
[[["Jason", "Kim"], ["Callie", "Luke"]], [["Jason", "Luke"], ["Callie", "Kim"]]]
return 重复组成员数量最少的组
[["Jason", "Callie"], ["Luke", "Kim"]]
我在想,我要尽量减少的数量是回头客的数量。所以对于每对两个人,对于他们已经在一个团队中的每次,如果结果将他们放在同一个团队中,那么结果就会有那个分数。例如,"scoring" 得出 return 值可能如下所示:
["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 平方时间),但希望它能让您了解我要优化的内容。这不需要是完美的优化,只是 "decent answer" 不会每次都将相同的组放在一起。
理想情况下,它将能够处理任何规模的组,并且还能够处理那天有人可能外出的事实(并非所有人都会在所有阵列中)。我想要 javascript 答案,但如果有人能想出逻辑,我应该能够翻译。
您可以收集一个对象中的所有配对并计数。然后只拿那些数量少的。
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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我创建了一个随机组创建者,但随机并不能真正保证您与以前从未合作过的人一起工作。如果有人能够生成一个 "Random Group Generator With History" 来跟踪以前的组并避免将人们一遍又一遍地放在同一组中,我肯定会使用它!有人知道怎么做吗?
为清楚起见:给定一个字符串数组
["Jason", "Kim", "Callie", "Luke"]
和一组先前的配对(也是数组)
[[["Jason", "Kim"], ["Callie", "Luke"]], [["Jason", "Luke"], ["Callie", "Kim"]]]
return 重复组成员数量最少的组
[["Jason", "Callie"], ["Luke", "Kim"]]
我在想,我要尽量减少的数量是回头客的数量。所以对于每对两个人,对于他们已经在一个团队中的每次,如果结果将他们放在同一个团队中,那么结果就会有那个分数。例如,"scoring" 得出 return 值可能如下所示:
["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 平方时间),但希望它能让您了解我要优化的内容。这不需要是完美的优化,只是 "decent answer" 不会每次都将相同的组放在一起。
理想情况下,它将能够处理任何规模的组,并且还能够处理那天有人可能外出的事实(并非所有人都会在所有阵列中)。我想要 javascript 答案,但如果有人能想出逻辑,我应该能够翻译。
您可以收集一个对象中的所有配对并计数。然后只拿那些数量少的。
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);
.as-console-wrapper { max-height: 100% !important; top: 0; }