考虑到一系列网络I / O活动的时间戳,什么是计算一天内所有时段的活跃度的最佳算法?
例如,选择插槽大小= 30秒,然后1天= 24 * 60 * 60/30 = 2880个插槽。对于一个时间段,根据给定的时间序列数据将其标记为有效或无效(如果有活动,则 有效 在此广告位中, 无效 ,否则)。然后计算活动率=(#活动槽)/(#总槽数)。
建议?
答案 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)空间。
如果你有一堆紧密聚集在几个时隙内的时间戳,第一种方法很可能会更有效率。如果您的时间戳较少,但它们在整个时间段内分布更均匀,则第二种方法可能会更好。