博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个好用的分组算法2
阅读量:6758 次
发布时间:2019-06-26

本文共 1750 字,大约阅读时间需要 5 分钟。

说明:可以将一组数字分到组 Arr[n] n  [seed,limit]  里。

比如 有一大筐水果 有大有小有苹果,有菠萝,榴莲,要求1大小相似的尽量放到一个框里,要求2同类型的水果尽量放一个框

一个框可以盛 20 - 40 个水果

这样分出来可以是

case 1 : 20 35 40 20 19

case 2: 20 35 40 20  1

这样就需要吧最后一个平摊到其他框,目前是放到前一个框里,分摊算法要看排序的重要程度和实际情况了。

///         /// 动态分组算法        ///         /// 
/// 源 /// 种子 /// 每组最大限制数量 /// 分组函数 /// 扁平数量限制 ///
public static List
> Group
(this List
source, int seed, int limit, Func
, T, bool> breakFunc, FlatGroupType flatType = FlatGroupType.None, int? flatLimit = null) { var res = new List
>(); while (true) { var buffer = source.Take(20).ToList(); if (buffer.Count == 0) break; var last = buffer.Last(); var inter = source.Except(buffer).ToList().GetEnumerator(); while (true) { inter.MoveNext(); var current = inter.Current; if (current == null || breakFunc(buffer, current) || buffer.Count == 40) { break; } buffer.Add(current); } res.Add(buffer); source = source.Except(buffer).ToList(); buffer = new List
(); } if (res.Last().Count < seed) { if (flatLimit == null) { flatLimit = seed; } new FlatGroup(flatType).FlatLast(res, flatLimit.Value); } return res; } public class FlatGroup { private readonly FlatGroupType flatType; public FlatGroup(FlatGroupType flatGroupType) { flatType = flatGroupType; } internal void FlatLast
(List
> source, int flatLimit) { if (source.Count == 1) return; var last = source.Last(); if (last.Count <= flatLimit) { source.Remove(last); Flat(source, last); } } internal void Flat
(List
> source, List
toFlat) { if (flatType == FlatGroupType.PushUp) { source.Last().AddRange(toFlat); } } }

 

转载于:https://www.cnblogs.com/zhuwansu/p/10960079.html

你可能感兴趣的文章
Ckeditor使用总结
查看>>
人事面试100问题--巧妙应答
查看>>
【工具类】怎么进入阿里云docker仓库
查看>>
Ceres-Solver库入门
查看>>
悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
查看>>
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
查看>>
hanoi塔的递归算法
查看>>
C# 校验给定的ip地址是否合法
查看>>
lumen 登陆 注册 demo
查看>>
基于服务的并行系统的通讯方式探讨
查看>>
设计模式——观察者模式
查看>>
Python多线程 简明例子
查看>>
《地球上的星星》
查看>>
mysql数据库的主从同步,实现读写分离
查看>>
89 fcanf和fprintf
查看>>
javascript——自定义右键菜单
查看>>
求二叉树中相差最大的两个节点间的差值绝对值
查看>>
PHP 类名::class含义
查看>>
设计模式简介和分类,重点在总结
查看>>
数据库默认端口
查看>>