0

我有一组事件(开始日期、结束日期、位置)。这些活动在国内进行,我需要弄清楚结束后哪个活动应该去哪里。

示例:

  1. [1/7, 6/7, Toronto](7月1日开始,7月6日结束)
  2. [2/7, 4/7, 蒙特利尔]
  3. [4/7, 11/7, 渥太华]
  4. [17/7, 22/7, 温哥华]

..etc(数据集大约有 100 个条目,因此性能不是真正的问题)

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

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

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

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

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

4

1 回答 1

1

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

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:(注意lseLast Selected Event

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. 你循环事件,贪婪地选择第一个与你选择的最后一个不重叠的事件
于 2012-07-13T21:38:33.700 回答