我需要找到一种解决以下问题的算法:
给定一个间隔列表(leftBound,RightBound),这是在此行为中对间隔进行分组的最有效算法:
间隔: (1,4),(6,9),(1,3),(4,8),(6,9),(2,7),(10,15)
通缉解决方案:
组(2,3)含有(1,3),(1,4),(2,7)
组(6,8)包含(4,8),(6,9)
组(10,15)包含(10,15)
当然有不同的可能解决方案:(2,7)也可能在第二组中。
我的方法是按照左边界对上升的间隔进行排序,如果它们的左边界限相同则按其右边界下降。然后我只是循环排序的间隔,并尝试将它们添加到我刚刚构建的组中。如果这是不可能的,我会为此时间间隔构建一个新组,并继续循环其余的订单。
这个算法是否保证,我的间隔时间内收到尽可能少的不同组?你能说这是解决这个问题的贪婪方法吗?
答案 0 :(得分:0)
这是一个建议:
按右边界排序:(1,3), (1,4), (2,7), (4,8), (6,9), (6,9), (10,15)
。
创建具有最低条目的组(rightBound - 1,rightBound)并将其删除:(2,3): (1,3)
。
将所有可能的时间间隔添加到论坛并将其删除:(2,3): (1,3), (1,4), (2,7)
。
重复2.和3.直到列表为空:1. (2,3): (1,3), (1,4), (2,7); 2. (7,8): (4,8), (6,9), (6,9); 3. (14,15): (10, 15)
。
可选:将组扩大到最大大小或使用最小条目作为组间隔(2.)并在添加间隔时增加左边界(3.)。
我认为它应该给出最少数量的组,因为在第2步中我们创建了一个无法避免的组,然后在第3步中,我们将所有内容添加到其中。