解决重叠项目的堆叠顺序

时间:2011-07-20 06:28:51

标签: algorithm conflict

我有一个Foo列表,其中包含以下属性:

class Foo
(
    Date From
    Date To
    int Importance
)

这些项目的FromTo日期可能会重叠。当两个foos重叠时,具有最高Importance的foo会覆盖其他项目。

是否有一个优雅的算法来获取Foo列表并解决任何重叠(通过使用上述规则确定哪个Foo具有最高Importance因子)?到目前为止,我的尝试都是丑陋的。最终,它们针对每个可能的重叠冲突进行一系列检查,例如在较低优先级foo之前的较高优先级,在较低优先级foo的范围的中间出现较高优先级foo,等等。这样的策略看起来不可维护,并且需要一种我尚未找到的更优雅的方法。

这里的一个重要问题是,较高优先级Foo可以细分较低优先级,因此我们无法简单地调整冲突From的{​​{1}}和To点}。

3 个答案:

答案 0 :(得分:1)

您可以使用优先级队列。

  1. 生成所有三元组(Date,bool,int),其中第一个参数是其中一个Foos的To或From属性,bool表示它是To(true)还是From(false),int是优先级。
  2. 按日期
  3. 对这些对的列表进行排序
  4. 创建一个由重要性排序的三元组的空优先级队列。
  5. 迭代排序列表,并为每个三元组(日期,isTo,重要性)执行:

    一个。如果它是From(isTo = false)则添加到队列

    湾如果是To(isTo = true),则从队列中删除

  6. 队列中的最大元素(您可以在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相交。按顺序解决冲突,你就完成了!