PHP算法将一组数据分类为不超过四个的组

时间:2018-06-28 15:16:40

标签: php algorithm sorting

我目前遇到的问题是我的数据集大约有 1000 个条目。

每个条目都有两个相关功能:

  • weight(浮动)
  • origin(字符串/另一个实体)

我必须将这些条目分类为最大四个条目。但是,组可以包含较少的条目。

  • 一组四个条目:非常好
  • 一组三个条目:好
  • 一组两个条目:不太好
  • 一组条目:真的很差(但如果不能避免的话,可能会出现)

现在,将这些条目分类到组中的方式取决于它们的功能,如下所示:

  • 最大组中weight的增量可以为 10%
  • 每个组中origin的值应尽可能多。拥有一个副本并不是很糟糕,但是应避免三个或三个以上具有相同origin的条目。

数据集weight中的范围大约为 20.0 120.0 origin大约有 50 个可能的值。

我必须在php中实现此功能,但是没有必要使用php实现来回答。仅算法就足够了。

我尝试对weight的所有值进行排序,然后每隔四个条目将它们拆分一次。但是,随后我得到的组很难根据origin值进行重新排列。我想我可以通过讨厌的实现来完成此操作,但我希望有一个非常优雅的算法可以做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:1)

这里是一个贪婪的人,可能会带来好的结果:

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)