使用开始和结束日期/时间计算事件数的算法

时间:2014-08-14 05:55:07

标签: php algorithm count

我有一组有开始和结束时间的事件。我想生成一个时间和事件数量的数组,当时值的变化用于创建图形。截至目前,我正在通过开始和结束时间的多次迭代来计算值。还有其他办法吗?

E.g。

Event 1: Jan 1 to Jan 10
Event 2: Jan 6 to Feb 6
Event 3: jan 8 to Feb 1

我应该得到像

这样的数组
Jan 1: 1
Jan 6: 2
Jan 8: 3
Jan 11: 2
Feb 2: 1
Feb 7: 0

2 个答案:

答案 0 :(得分:1)

创建一个包含所有开始和结束时间的数组,以及此日期事件是开始(1)还是结束(-1)的信息:

[(Jan 1 , 1), (Jan 10, -1), (Jan 6, 1), (Feb 6, -1), (Jan 8, 1), (Feb 1, -1)]

按日期对数组排序:

[(Jan 1 , 1), (Jan 6, 1), (Jan 8, 1), (Jan 10, -1), (Feb 1, -1), (Feb 6, -1)]

遍历数组,保留计数器并根据需要向数组添加日期。您可能希望将同一日期的各种事件合并到一个条目中。

(这不是O(n),但我认为目标是优于原始的O(n²)。)

答案 1 :(得分:0)

如果您将事件作为排序列表(最早的日期优先),那么 非常糟糕的伪代码如下

running_count = 0
list_of_end_dates = [];
vector_of_date_events_pairs = [];
For Each item in the events collection { 
    running_count += 1
    while(queue.tail < item.end_date) {
        queue.pop_back()
        running_count -= 1
    }
    vector_of_date_events_pairs.push(item.start_date, running_count)
    list_of_end_dates.push_front(item.end_date)
}