我有一个Foo
列表,其中包含以下属性:
class Foo
(
Date From
Date To
int Importance
)
这些项目的From
和To
日期可能会重叠。当两个foos重叠时,具有最高Importance
的foo会覆盖其他项目。
是否有一个优雅的算法来获取Foo
列表并解决任何重叠(通过使用上述规则确定哪个Foo
具有最高Importance
因子)?到目前为止,我的尝试都是丑陋的。最终,它们针对每个可能的重叠冲突进行一系列检查,例如在较低优先级foo之前的较高优先级,在较低优先级foo的范围的中间出现较高优先级foo,等等。这样的策略看起来不可维护,并且需要一种我尚未找到的更优雅的方法。
这里的一个重要问题是,较高优先级Foo
可以细分较低优先级,因此我们无法简单地调整冲突From
的{{1}}和To
点}。
答案 0 :(得分:1)
您可以使用优先级队列。
迭代排序列表,并为每个三元组(日期,isTo,重要性)执行:
一个。如果它是From(isTo = false)则添加到队列
湾如果是To(isTo = true),则从队列中删除
队列中的最大元素(您可以在O(1)中查找)中的任何时候都包含当时获胜的元素。
(如果您需要实际的Foo对象,只需使用对Foo的引用将三元组设为4元组。)
答案 1 :(得分:1)
我也会使用优先级队列,就像Petar一样,但我会简单地将所有Foo元素存储在其中。该队列中的优先级将是:第一个 - 从日期开始,其次是到日期,第三个是“优先级”(我的意思是首先根据from字段对所有元素进行“排序”,然后根据字段对具有相同字段的元素进行排序)按照优先顺序,坚持不懈地进行。完成优先级队列后,您可以简单地迭代检查每对元素,检查它们之间的“距离”是否相同(距离为((To1-To2)+(From1-From2))。如果你找到这样一对留下第一个项目并删除第二个项目。你可以在创建队列时或插入新项目时这样做。如果我是正确的话,整个算法将是O(nlogn)。
@Edit:哦,对不起我早上喝咖啡之前,我觉得你的意思是2个Foo有相同的To和From,从我现在的理解你也想删除以下情况中的项目:
Foo1从5到10优先级1
Foo2从1到11优先级2
什么是“封闭”的Foo(即1-11)具有较低的优先级?
@ Edit2:好吧我的算法稍作调整即可。如上所述,不是t1-t2 + f1-f2而是按顺序对它们进行排序,并检查每一对F2(来自foo2)是否在T1和F1之间。如果是,则删除Foo2。
实施例:
Foo1:从3到4优先级1
Foo2:从5到6优先级2
Foo3:从1到7优先级3
在确定优先顺序后,它将是:
Foo3 - > Foo1 - > foo2的
首先检查Foor3和Foo1,Foo1的From在Foo3的From和To之间,所以你删除了Foo1,因为它的优先级较低(在这种情况下,假设越好越好)。然后检查Foo3和Foo2(如果没有删除,你会检查Foo1和Foo2)。再次检查From of Foo2是否介于Foo3的From和之间,并且由于它是,删除Foo2。
整个算法仍然是O(nlogn)。如果我没有看到某些失败的情况,请给我一个喊叫。
答案 2 :(得分:0)
使用优先级队列。按importance
排序,然后按from
排序,然后按to
排序。现在,您提取的每个foo
将清除(不冲突)或与相等或更高优先级foo
相交。按顺序解决冲突,你就完成了!