匹配事件结束日期与另一事件开始日期的优化

时间:2012-07-13 18:58:26

标签: javascript algorithm date optimization data-structures

我有一组事件数据(开始日期,结束日期,地点)。这些事件在国内发生,我需要弄清楚哪个事件应该在结束后去哪里。

例:

  1. [1 / 7,6 / 7,多伦多](7月1日开始,7月6日结束)
  2. [2 / 7,4 / 7,蒙特利尔]
  3. [4 / 7,11 / 7,渥太华]
  4. [17 / 7,22 / 7,温哥华]
  5. .. etc(数据集大约有100个条目,因此性能不是真正的问题)

    在这个例子中,事件1可以移动并执行事件4,因为它在7月6日结束,事件4在17日开始。 (假设在同一天过境)

    所有找不到合适匹配项的事件都会存储在报告中,供有人手动匹配。

    此优化代码将在javascript中完成。

    我的第一个想法是拥有2个阵列,具有相同的数据。第一个数组按开始日期排序,第二个数组按结束日期排序。然后浏览结束日期列表并尝试为其找到合适的开始日期,然后从数组中删除这些条目并继续这样,直到不再可能匹配为止。

    有人对如何解决这个问题有更好的了解吗?如果您需要更多详细信息,请告诉我们!

1 个答案:

答案 0 :(得分:1)

你的问题不是很清楚。如果我理解正确,您的目标是选择一个事件子集,以便您的选择最大化事件数量(并且没有重叠事件)。如果是这样,您的问题可以被视为Activity Selection Problem。有一个简单的贪婪算法来解决这个问题。

event[1..n] the n events
start[i] the start time of the event number i
finish[i] the finish time of the event number i

并假设您已经按结束时间对事件进行了排序

以下贪婪算法将找到非重叠事件的最大子集 S : (请注意 lse 最后选定的事件

S = {event[1]}
lse = 1

foreach event[i] do:
     if start[i] > finish[lse]:
         S = S + {event[i]}
         lse = i

return S

基本上:

  1. 您按结束时间对事件进行排序
  2. 您选择第一个活动
  3. 你在事件上循环,贪婪地选择第一个与你选择的最后一个没有重叠的事件