问题描述
我们有一组介于[1,..,4]之间的整数值。我们希望在1的基础上将特定值分布到[1,...,10]之间不同长度的段中。
下表显示了一个示例:

   Example Value  segments  distribution
    a       4       4          1 on each segment
    b       3       4          1 on the first 3 segments
    c       3       2          2 on the first segment ( 1 + 1) and 1 on the second segment

我的解决方案是:
如果value>=段,则在段上循环,并在每个段上加1,直到dispatch变为value
如果value源代码
所有的例子(a,b,c)都在下面的代码中表示。输出如下:
#example a [1, 1, 1, 1]
#example b [1, 1, 1, 0]
#example c [2, 1]

#!/usr/bin/env python

import os
import re
import sys
import argparse


if __name__ == "__main__":
    threshold = 4

    #(a) value = 3 and segments = 4
    dispatch = 1
    value = 4 + 1
    seg1 = [0,0,0,0]
    for i in range(0, len(seg1)):
        if dispatch == value:
            break
        seg1[i] += 1
        dispatch += 1

    print ("example a %s" %seg1)

    # (b) value = 3 and segments = 4
    dispatch = 1
    value = 3 + 1
    seg2 = [0,0,0,0]
    for i in range(0, len(seg2)):
        if dispatch == value:
            break
        seg2[i] += 1
        dispatch += 1

    print ("example b %s" %seg2)

    # (c) value = 3 and segments = 2
    value = 3 + 1
    dispatch = 1
    seg3 = [0,0]
    for i in range(len(seg3) - 1, -1, -1):
        if i == 0:
            seg3[i] = value - dispatch
            break
        seg3[i] += 1
        dispatch += 1

    print ("example c %s" %seg3)

问题
我发现我使用的解决方案非常难看我无法从这些例子中推断出一个公式。我们能从这些例子中推导出一个公式吗这会使算法后面有一个公式lol
我的代码是C语言的,但是我发现在
在这里。

最佳答案

数学公式很简单:

value / segments

提供至少要放入每个段中的项目数
value % segments

提供接收额外项目的段数
举你的例子:
                      v/s    v%s
a       4       4      1      0
b       3       4      0      3
c       3       2      1      1

这样,你就得到了一个非常简单的算法:
unsigned int n = value/segments;
unsigned int c = value%segments;
for(unsigned int i = 0; i < segments; ++i)
    theSegments[i] = n + (i < c);

或者,如果要跳过数组:
unsigned int f(unsigned int values, unsigned int segments, theSegment)
{
    // assuming theSegment being checked for < segments
    return value/segments + (theSegment < value%segments)
}

如果要使用基于1的数组(将索引0作为伪数组):
for(unsigned int i = 1; i <= segments; ++i)
    theSegments[i] = n + (i <= c);

关于python - 如何基于1在一组 segmentation 上分配值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48460508/

10-10 18:55