基线 - 表格:
通话日期/时间,通话时间
如何计算“忙时”?
http://en.wikipedia.org/wiki/Busy_hour - 在通信系统中,滑动60分钟,在此期间发生给定24小时内的最大总流量负载。
答案 0 :(得分:4)
在一段延长的时间内(因为你可以计算多少天来计算),计算当天每分钟有效的通话次数 - 其中有1440次。然后,对于当天的每一分钟计算移动的60分钟活动呼叫总和,此总和最大化的分钟是繁忙时段的开始(假设您已计算出前移移动平均值)。不要忘记在午夜环绕。
这似乎很简单,我怀疑我误解了你的问题。
答案 1 :(得分:1)
这可以在线性时间内完成,方法是使用遍历排序事件列表的两个指针(左和右)。实际上,遍历是在一个排序的呼叫事件列表上完成的,包含呼叫开始事件和呼叫结束事件。
左指针从最左边的开始事件开始。右指针不迟于(左侧时间+ 1小时)移动到最新事件。我们还维护一个 sum 变量,用于计算间隔中所有呼叫持续时间的总和。
在每次迭代中,我们将左指针移动到下一个事件(相应地更新总和),然后我们使用右指针(再次更新总和)直到其结束位置(稍微不到1小时后)。
sum 的最大值是在繁忙时段窗口获得的。
我没有详细介绍如何在移动指针时更新sum变量,但我相信在恒定时间内完成它并不复杂。
该算法的优点在于它没有粒度问题,并且它在事件数量上是线性的。
<强> - 编辑 - 强>
实际上这是一个O(N * Log N)算法,因为输入表不提供我假设的事件的排序。我们需要先生成排序的事件列表
答案 2 :(得分:0)
将前一小时相加并记下总和。然后添加下一分钟的所有流量并删除第一分钟的流量。如果这个数额大于第一个 - 记下它并继续。
像这里的原始代码一样Minute busyHourStart = 0;
Minute currentStart = 0;
int busyHourSum = 0;
int currentSum = 0;
while( minutesLeft){
currentSum = sumTrafficForMinutes(currentStart, currentStart + 60);
if(busyHourSum < currentSum){
busyHourSum = currentSum
busyHourStart = currentStart;
}
++currentStart;
}
答案 3 :(得分:0)
有一种1D热图。
将调用分层显示时间,然后找到“最热”的小时。