在给定时间戳的情况下计算时隙活动性的算法

时间:2014-06-30 17:20:29

标签: algorithm timestamp time-series

考虑到一系列网络I / O活动的时间戳,什么是计算一天内所有时段的活跃度的最佳算法?

例如,选择插槽大小= 30秒,然后1天= 24 * 60 * 60/30 = 2880个插槽。对于一个时间段,根据给定的时间序列数据将其标记为有效无效(如果有活动,则 有效 在此广告位中, 无效 ,否则)。然后计算活动率=(#活动槽)/(#总槽数)。

建议?

1 个答案:

答案 0 :(得分:0)

我不确定你的意思"最好"在这种情况下,但请忍受我。

因此,我们需要一个24小时内需要多个时隙和时间戳的函数,并返回时间戳所属的时隙。类似的东西:

int GetSlot(int numberOfSlots, int secondsSinceMidnight)
{
    int secondsInSlot = 24 * 60 * 60 / numberOfSlots;
    return secondsSinceMidnight / secondsInSlot;
}

现在,从时隙到时间戳计数创建一个空的地图数据结构。开始循环遍历时间戳集。对于每个时间戳,请致电GetSlot;调用它的插槽assignedSlot。我们检查地图数据结构,看它是否包含assignedSlot的条目。如果是,我们将映射计数器增加1。否则,我们为assignedSlot添加一个新条目,并将时间戳计数设置为1。继续所有时间戳。

最后,我们在每个活动插槽的地图数据结构中都有一个条目。我们知道插槽的总数,因此获取平均活动插槽数很容易:map.size() / numberOfSlots。我们记得的信息比您技术上需要的更多,但仍然如此。

这是O(n)时间和O(n)空间。

另一种方法是按升序对时间戳进行排序,然后循环遍历它们,计算活动时间段。这可以是O(n log n)时间和O(1)空间。

如果你有一堆紧密聚集在几个时隙内的时间戳,第一种方法很可能会更有效率。如果您的时间戳较少,但它们在整个时间段内分布更均匀,则第二种方法可能会更好。