问候!
我觉得这个问题与bin打包问题有关,也可能与设置分区问题有关......我只是想在我走得太远之前把它从某人身上反弹。
我输入数据(在数据文件中)如下:
entry_one 55
entry_two 56
entry_three 61
entry_four 62
entry_five 62
entry_six 68
entry_seven 72
entry_eight 73
entry_nine 78
entry_ten 79
entry_eleven 84
entry_twelve 85
entry_thirteen 91
entry_fourteen 92
entry_fifteen 99
entry_sixteen 100
entry_seventeen 121
entry_eighteen 125
entry_nineteen 127
entry_twenty 161
有了这些数据,我希望有一个算法:将条目分组成组,使得组内的条目相关数值在X内(在我的例子中,X是16)。例如,一个安排可能是:
group one:
entry_one
entry_two
entry_three
entry_four
entry_five
entry_six
group two:
entry_seven
entry_eight
entry_nine
entry_ten
entry_eleven
entry_twelve
group three:
entry_thirteen
entry_fourteen
entry_fifteen
entry_sixteen
group four:
entry_seventeen
entry_eighteen
entry_nineteen
group five:
entry_twenty
这种特殊安排是使用一种天真的贪婪算法实现的,其中我以最低值(entry_one的55)开始,并允许55 + 16以下的所有值成为该组的一部分。然后我开始使用不在该组中的下一个条目(entry_seven的72)并允许所有低于72 + 16的值成为 组(第二组)的一部分,依此类推那个命令。
我相信虽然一个天真的贪婪算法有效,但它不太可能给我一个最佳的分组/分类,我定义了“最佳分组”,以便组的总数< / em>是最小化的(在我的情况下,这是为了作业调度,所以我希望尽可能地将工作分组,以尽量减少转换。)
人们可以建议的任何想法,模块,算法,示例代码?
谢谢!
编辑:我想我应该补充一下这与垃圾箱包装问题的区别。在装箱问题中,优化是:“给定这些固定尺寸的箱子,这些具有固定尺寸的物体,如何将这些固定尺寸的物体中的大部分填充到这些箱子中而不会溢出每个箱子。”在我的情况下,我所拥有的是无限大小但是过滤条目的箱子,因此如果一个对象“匹配”一个箱子的签名,它可以插入到所述箱子中,但是我们是什么希望是最小化我们需要创建的垃圾箱总数。答案 0 :(得分:1)
最糟糕的情况是O(n
2
)
问题,因为您可以将“重复所有点”替换为第4步。
答案 1 :(得分:0)
如果我理解问题,那么贪心算法实际上是最优的。让G成为贪婪的解决方案让S成为任何解决方案。考虑G与S不同的第一组。由于G是贪心解,G的组大于S的。例如,
G : [1, 2, 3][4, 5, 6, 7][8, 9, 10][11, 12]...
S : [1, 2, 3][4, 5, 6][7, 8, 9][10, 11, 12]...
我们可以从S得到一个新的解决方案S',它与更长的前缀上的G一致而不引入新的组。只需从下一组中偷走一些物品。生成的组有效,因为一个已经在G中,另一个是有效组的子组。
S': [1, 2, 3][4, 5, 6, 7][8, 9][10, 11, 12]...
通过归纳,G实际上是最佳的。