2

我有一个问题,这与逻辑/算法而不是实际代码(PHP/JS)有关。

假设您有一堆事件,在一周内发生。每个事件的元数据都存储在数据库中。(Wordpress + 事件浓缩咖啡)

即,事件 A,周一至周五 8-5。活动 B,周二至周五 11-4。等等。

用户可以在网站上购买这些活动。我需要确保他们不能购买至少 2 个日程冲突的活动。

我想尽可能避免去数据库。有人建议我在结帐时检查购物车中冲突的事件 ID 并抛出错误。那行得通,但是如果我在一周内有大约 12 个事件怎么办?我无法处理(12 选择 2,我认为是 66)情况,最坏的情况。

解决这个问题的最快和最肮脏的方法是什么?或者更确切地说,解决这个问题的好方法是什么?

我正处于时间紧迫的状态,因此目前仅客户端的解决方案可能是可以接受的。

谢谢!

编辑:这可能是一个更好的问题:假设您有一个事件元数据列表,包括开始日期/时间和结束日期/时间。您如何检查每个事件的冲突?

我从来没有做过这种时间/日程冲突检查,所以无论你有什么想法,请开火!

谢谢!

4

1 回答 1

1

按开始时间对事件进行排序

你的问题可以用一个非常简单的算法来回答——但由于我不熟悉你的数据库,你必须把这个算法翻译成自己的代码:

假设您的事件可以作为列表中的对象访问: ​​event[0], event[1],... 成员为 envent[i].start 和 event[i].end 用于开始和结束时间(总是假设 event[ i].start <= event[i].end)。为了检查任何重叠事件,您首先按事件的开始时间对事件进行排序,以便

event[i].start <= event[i+1].start

现在,检查重叠意味着只需将每个事件的结束时间与下一个开始时间进行比较:

event[i].end <= event[i+1].start

如果上述关系适用于所有索引 i,则(显然)没有事件相互重叠。但是,如果对于某些索引 i 这种关系不成立,那么您有重叠:

event[i].start <= event[i+1].start < event[i].end

关于相等时间的注意事项:

我制定了算法,假设一个事件恰好在前一个事件停止时开始是可以的。但如果您认为这是重叠,您只需更改条件以检查:

event[i].end < event[i+1].start    (use < instead of <=)
于 2013-10-02T12:19:09.657 回答