php - php算法将一组数据分成不超过四个的组
问题描述
我目前有一个问题,我有一个大约1000 个条目的数据集。
每个条目都有两个相关的特征:
weight
(漂浮)origin
(字符串/另一个实体)
我必须将这些条目分成最大组。四个条目。但是,组可以包含更少的条目。
- 四人一组:非常好
- 三人一组:好
- 两组条目:不太好
- 一组一个条目:非常糟糕(但如果无法避免,则可能)
现在,这些条目被分类到组中的方式取决于它们的特征,如下所示:
- 最大。组内的delta
weight
可以是10%。 origin
每个组中应该有尽可能多的不同值。origin
拥有一个副本并没有那么糟糕,但应避免拥有三个或更多相同的条目。
数据集中weight
的范围大约为20.0到120.0。大约有50种不同的可能值origin
。
我必须在 php 中实现这一点,但不需要用 php 实现来回答。单独的算法就足够了。
我尝试为它们的所有值排序weight
,然后每隔四个条目简单地拆分它们。但是我得到的组很难根据origin
价值重新排列。我想我可以通过一个讨厌的实现以某种方式完成这件事,但我希望有一个非常优雅的算法可以做到这一点。
提前致谢!
解决方案
这是一个可能会产生良好结果的贪心:
Sort entried by weight
groups = []
used = array of length len(entries) initialized in false
For i = 0 to len(entries):
if (used[i] == false):
group = [entries[i]]
j = i + 1
while(j < len(entries) and delta(group[0], entries[j]) < 10 and len(group) < 4):
if used[j] == false and entries[j].origin != all the origins in group:
group.add(entries[j])
used[j] = true
j = j + 1
if (len(group) < 4):
//decide if you prefer a small group or a bigger group with repeated origins
groups.add(group)
推荐阅读
- ibm-cloud - Watson 助手错误“Http 响应代码为 [401]”
- angular - 如何将 Angular 6 项目转换为 PWA 应用程序
- java - 在这种情况下如何对列表进行流式排序?
- c# - 我需要从 C# 函数属性返回 Ajax 错误响应
- c# - 无法更新多个表中的 Isactive 标志状态
- javascript - 如果选中复选框,如何调整表单 validator.js 以仅发送表单
- ruby-on-rails - 如何修复“警告:常量 ::Fixnum 已弃用”错误
- java - 如何将值从 testng.xml 传递到 hooks java 类
- jq - 打印没有 ansible_host 的对象
- mysql - 按特定范围内的日期获取结果,每 N 天重复一次