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

按“等和”分组

屠坚壁
2023-03-14

我试着取一个数字列表,把它们分成>=n组,这样每组的和近似相等(但不一定完全相等),并且“离群值”可以在它们自己的一组中。

因此,对于一个由3个组组成的目标和一个类似于以下内容的输入:

[3, 2, 1, 4, 2, 5]

输出可能是:

[[5,1], [4,2], [3,2]]
6, 6, 5

我想我已经把方法学弄清楚了,作为伪代码,它看起来像这样:

let target = Ceil(Sum(Series) / NumberOfTargetGroups) //The ideal size of each group

while (count(UnpickedNumbers) > 0)
    let CurrentGroup = new group
    while (sum(CurrentGroup) < target)
        for each Unpicked in sortDesc(UnpickedNumbers)
            if (sum(CurrentGroup) + Unpicked)
                Add Unpicked to current group
                Remove unpicked from available numbers

我搞不懂的是,如何将该逻辑转换为groupby(n=>...)-之所以要这样做,是因为数字列表实际上来自一系列对象的属性,我希望以这种方式对这些对象进行分组。

共有1个答案

徐德海
2023-03-14

划分是NP完全问题。我已经预先说明了代码段:

public IEnumerable<IEnumerable<TObject>> Algo<TObject>(IEnumerable<TObject> source, int groups,
                                                       Func<TObject, int> intSelector)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    source = source.OrderByDescending(intSelector);
    var evaluated = source as IList<TObject> ?? source.ToList();
    if (groups > evaluated.Count())
    {
        throw new ArgumentException("Invalid group count.");
    }

    var result = new List<List<TObject>>();
    for (var i = 0; i < groups; i++)
    {
        result.Add(new List<TObject> { evaluated[i] });
    }

    for (var i = groups; i < evaluated.Count(); i++)
    {
        var bestIndex = 0;
        var bestSum = result[bestIndex].Sum(intSelector);
        for (var j = 1; j < result.Count; j++)
        {
            var sum = result[j].Sum(intSelector);
            if (sum < bestSum)
            {
                bestSum = sum;
                bestIndex = j;
            }
        }

        result[bestIndex].Add(evaluated[i]);
    }

    return result;
}

它的效率不高(有很多方法可以优化它),结果也不总是最优的。但希望它将是您的算法的基础(也许大约对您来说就足够了-测试它!)。

编辑:我已为您修改了代码段-您不必使用groupby。用法:

var widgets = new List<Widget>  { W1, W2, etc. };
var result = Algo(widgets, groups: 3, intSelector: widget => widget.Height);
 类似资料:
  • 我想用多个变量分组,用数字求和,用java中的list得到结果。与SQL group by一样,我希望将数据记录与最低的字符串合并。我想做的与下面的SQL相同, 如果数据存在于下面的项目表中, 我预计结果会在下面。当用orderId按00-82-947和00-82-952分组时,我想像SQL分组一样得到较低的一个。 如何在Java中实现这一点?我认为这对我来说是可行的,但在这种情况下,未按分组的o

  • 问题内容: 我需要执行以下sql: 此sql在我的oracle数据库中运行良好,但在我有时使用的h2数据库中却不起作用,因为未定义等级和分区。 因此,我需要转换此sql,以便它可以在h2和oracle中工作。 我想使用Java执行此sql。那么有可能将此sql拆分为不同的sql,而不进行排名和分区吗?然后用Java处理呢? 问题答案: 如果在分区中是唯一的,则可以:

  • 问题内容: 建立库存系统。我有很多产品,每个产品都有三个不同的变量。因此,对于总库存,我想按两列(产品和尺寸)和总数量分组以获得总库存。 我想要输出的内容: 小部件一-2:375 小部件二-3:150 小部件二-2:150 我想出了如何使用以下代码将一列分组并求和: 我只是按两列分组。可能吗?还是应该仅针对这三种尺寸的商品创建三种不同的产品并删除该列?谢谢。 问题答案: 根据示例表,您似乎希望分组

  • 问题内容: 我知道有一些与此相关的帖子,但是我的情况有些不同,因此我希望获得一些帮助。 我需要从数据库中提取一些数据,这些数据是每天交互的累积计数。目前这就是我所拥有的 这样的输出接近我想要的,但不完全是我所需要的。我遇到的问题是日期与发生互动的时分秒存储在一起,因此group by不能将天分组在一起。 这就是输出的样子。http://screencast.com/t/N1KFNFyil 12月2

  • 问题内容: 我有一个称为 activity_dt 的日期时间,数据如下所示: 如何按日期和小时分组? 问题答案: SQL Server: 甲骨文: MySQL的:

  • 问题内容: 给定一个在每行上都带有时间戳的表,您将如何格式化查询以适合此特定的json对象格式。 我正在尝试将json对象组织成年/月。 json以查询为基础: 这是我到目前为止的查询- 该查询正在分解,因为它(可预测地)将不同年份组合在一起。 问题答案: 是你想要的。