尽可能分发数字

时间:2018-05-07 04:04:30

标签: sql sql-server sql-server-2008-r2

这似乎是我试图解决的两步问题。

我们说我们有N条记录,我们正试图尽可能均匀地分配到K组。

第二个问题 - K中的每个组只能接受M个记录。

例如,如果我们有5个记录和3个组,那么我们将2分配到组K1中,2分配到组K2中,1个记录分配到组K3中。但是,如果在第1组中说,它最多只接受1条记录。然后,安排需要为1组K1组,2组为K2组,2组为K3组。

在解决方案之后我没有必要但我可能需要用什么算法来解决这个问题?显然,对于发行版,我需要使用Greedy算法吗?但是对于第二步,这似乎有点复杂

编辑: 我看的例子是:    Number of records: 23 Groups: 10 Max records for each group G1 = 4 G2 = 1 G3 = 0 G4 = 5 G5 = 0 G6 = 0 G7 = 2 G8 = 4 G9 = 2 G10 = 2

2 个答案:

答案 0 :(得分:0)

如果N = 12且K = 3,则在正常情况下,您只需将每个组拆分为V = 12/3 = 4。但由于你有M限制,例如K3只能接受1,那么分布可以是6-5-1,但不均匀分布。

所以我想你需要根据M限制对K进行排序,所以对于上面的例子,组顺序变为K3-K1-K2。

然后,如果分布值V大于该组的接受量M,则需要取余数并将其再次分配给剩余的组(K3 = 1,然后4-1 = 3必须分配给K1和K2)。

实施可能很复杂,我希望你能找到更简单的解决方案

答案 1 :(得分:0)

根据我的理解,您需要将所有允许固定数量值的组分开,然后在其余组之间平均分配记录。让我们举一个例子,假设我们有15条记录需要分配到5组(G1,G2,G3,G4和G5)。另外,我们假设G2和G4分别允许最大记录为2和4。现在算法应该是这样的:

  1. 根据群组数量获取记录的平均值(天花板整数)(在此示例中,我们将获得3)。
  2. 添加所有小于我们平均值的最大允许记录数(在此示例中,它只有G2的最大限制(即2)小于我们的平均值,因此该数字为2)。< / LI>
  3. 现在从总记录中减去步骤2中的数字,并从总组中减去步骤2中涉及的组数。 (剩余总记录:13,剩余总组4)。
  4. 使用剩余记录和组获取新的平均值(上限整数)。 (新平均值4)。
  5. 获得平均值(整数)(即3)并为其余组分配相同数量的记录 - 1.
  6. 获取Mod(即1)并将该号码分配给最后一组。
  7. 现在我们终于有了这里: G1(无限制): 4 G2(限制2): 2 G3(无限制): 4 G4(限制4): 4 G5(无限制): 1

    如果你认为这个算法在某些情况下可能会失败,请告诉我。

    获取上限整数平均值的公式 floor((@ total_records + @ total_groups-1)/ @total_groups)