【问题标题】:Optimization for matching End Date of an Event with Start Date of another Event匹配一个事件的结束日期和另一个事件的开始日期的优化
【发布时间】:2012-07-13 16:05:17
【问题描述】:

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

示例:

  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 个具有相同数据的数组。第一个数组按开始日期排序,第二个数组按结束日期排序。然后浏览结束日期列表并尝试为它找到一个合适的开始日期,然后从数组中删除这些条目并继续这样直到不再匹配为止。

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

【问题讨论】:

  • 听起来像一个典型的间隔调度问题,并且似乎您已经在使用“默认”贪婪算法方法,这可以看作是最佳的,除了您实际上不需要第一个排序数组

标签: javascript algorithm date optimization data-structures


【解决方案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: (注意 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. 您循环播放事件,贪婪地选择第一个与您选择的最后一个不重叠的事件

【讨论】:

  • 哇,很高兴我知道这种算法有一个名字!我正在思考如果事件重叠会产生什么影响。从我的示例中可以看出,事件 #2 包含在事件 #1 的时间范围内。我对 2 个数组的想法是,数组中按开始日期排序的剩余内容是能够确定哪些事件无法找到另一个合适的事件,该事件在剩余事件开始的位置结束。示例:事件 #1 不能由列表中的任何其他事件开始,因为所有结束日期都大于事件 1 的开始日期。
  • 好吧,贪心算法会找到你可以参加的最大组事件。如果您不希望活动重叠,您未选择的所有活动无法参加。因此,如果算法选择事件#1,则事件#2 不能参加。如果您允许事件重叠,则不需要任何算法:只需选择所有事件;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2020-03-16
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多