当前位置: 首页 > 知识库问答 >
问题:

将用户分成小组的算法(基于每个小组的最小/最大数量)

沈国安
2023-03-14

我正在尝试提出一种算法,用于将团队排序并分配给固定数量的用户。我发现的大多数算法都假设要除以的组数;我想创建一个智能系统,其中组自动分配(尽其最大能力),并根据总用户数以及每个组的最小和最大用户数进行预测。

为每一组假设以下标准:

    < li >每组最少3个 < li >每组最多6个 < li >基于用户总数的智能分组

以下是基于总用户数和每个组的最小/最大值的一些可能性:

对于24名成员:

  • 4组5人,1组4人
  • 6组,每组4人
  • 4组,每组6人

21名成员:

  • 3组6人,1组3人
  • 3组5人,1组6人(更好选择)

10名成员:

  • 2组5个(更好的选择)
  • 2组3和1组4

尽管没有必要,但组的“更好的选择”将是每个组的用户数量相等(例如,10名成员将是2组5人),除非不可能(例如,21名成员),即5 5 5 6在每组成员方面比6 6 6 3更平等。

共有2个答案

蔺弘
2023-03-14

这里有一个JS解决方案,适合任何感兴趣的人https://jsfiddle.net/kp8d0w27/6/

第一个循环检查与会者总数是否可以平均分配。如果可以,就这样做。

第二个循环仅在总计不相等可整除时运行,并将循环到余数(模数)大于最小集且小于最大值。

最后,我使用一个名为 chunk 的 Lodash 函数将原始数组拆分为相等的部分。

const minNumber = 3
const maxNumber = 6

let divisible = false
let totalGroups = 0
let perGroup = 0

const attendees = ['chris', 'kevin', 'thomas', 'gio', 'nathan', 'michael', 'elyse', 'sarah', 'jacinthe', 'chloe', 'benoit', 'alex', 'darren', 'john']
const totalAttendees = attendees.length

// Can we divide into equal groups?
for (let divider = maxNumber; minNumber <= divider; divider--) {
  totalGroups = totalAttendees / divider

  if (Number.isInteger(totalGroups)) {
    divisible = true
    perGroup = divider
    break
  }
}

// Nope, so divide teams and make sure their between our min and max
if (!divisible) {
  totalGroups = 0;

  for (let j = maxNumber, remainder = 0; minNumber <= j; j--) {
    remainder = totalAttendees % j

    if (remainder >= minNumber && remainder <= maxNumber) {
      perGroup = j;
      break
    }
  }
}

console.log(JSON.stringify(_.chunk(attendees, perGroup)))

不是最干净的(我在这里没有考虑到一些情况,比如参加人数少于最低人数),我仍然在重构,但它工作得很好,解决了我最初的问题。

郏瀚
2023-03-14

根据您目前给出的标准(最小组大小变化),案例数量是有限的。

    < li >如果目标是3、4或5的倍数,请分成大小相等的组。(我们从来不需要规模为6的组。) < li >否则目标是1或2 (mod 3)。 < ul > < li >对于mod 1情况,使用一组4个,所有其他组为3个。 < li >对于mod 2情况,使用两组4个,所有其他组为3个。

请注意,对于21,您省略了7组3的明显选择。

使用此算法

  • 24 - 8组,每组3
  • 21 - 7组,每组3
  • 10 - 2组3人,1组4人(1(mod 3)情况)
  • 14 - 2组3人,2组4人(2(mod 3)情况)

也许你在悄悄地想(但没有说)你也想尽量减少小组的数量。如果这是真的,那么你需要指出小组数量和小组规模变化的相对重要性。这两个因素需要权衡。

 类似资料:
  • 我有一个背景工作,需要合并很多项目在一起。我想将其拆分为多个“子作业”,每个子作业合并数据的一个子集,然后最后一个过程将所有“子作业”的输出合并在一起。 一种简单的方法是将数据分成x元素组。问题是最后一个组可能有1个元素的剩余部分,因此它将是一个“noop”。我想找到最佳的“x”,这样组就大致相等,并且每个组中有最小和最大数量的元素(例如,不少于10个元素,不超过20个) 在Ruby中有什么好的算

  • 问题内容: 上下文:我正在构建一个读取rss feed并在后台更新/检查feed的小站点。我有一个数组来存储要显示的数据,另一个数组来存储已显示的记录的ID。 问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。 该网站将保持运行状态,并进行更新,并且不太可能经常重启/刷新浏览器。 如果我想从数组中

  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都

  • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod

  • 计算newArr数组所有对象中arr二维数组,比较后返回其中的[[最小值,最小值],[最大值,最大值]]; 要这种结果[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]

  • NowCoder 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。 解题思路 可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,