【问题标题】:Create Groups Without Repeating Previous Groupings创建组而不重复以前的分组
【发布时间】:2017-02-02 15:10:53
【问题描述】:

我创建了一个随机组创建者,但随机并不能真正保证您与以前没有合作过的人一起工作。如果有人能够生成一个“具有历史记录的随机组生成器”,它可以跟踪以前的组并避免将人们一遍又一遍地与相同的人分组,我肯定会使用它!有人知道怎么做吗?

为了清楚起见:给定一个字符串数组

["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 答案,但如果有人能提出逻辑,我应该能够翻译。

【问题讨论】:

  • 请补充一些想法,你如何从第二行到第三行,结果。
  • 你可以寻找加权随机抽样
  • @NinaScholz 希望对您有所帮助?我尝试对这些步骤添加更深入的解释。

标签: javascript arrays algorithm heuristics


【解决方案1】:

您可以收集一个对象中的所有配对并计数。然后只取那些数量较少的。

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; }

【讨论】:

  • 这是一个超级聪明的计算方法。这绝对是我想开始的地方,但我如何“只取那些数量较少的”。有没有一种简单的方法来获取数量较少的那些并且仍然保证完全覆盖(每个人都在一个组中)?
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 2021-02-28
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多