Esto se puede hacer en un tiempo lineal, mediante el uso de dos punteros (izquierda y derecha) que atraviesan la lista ordenada de eventos. En realidad, el recorrido se realiza en una lista ordenada de eventos de llamadas, que contiene eventos de inicio de llamada y eventos de fin de llamada.
El puntero izquierdo comienza desde el evento de inicio más a la izquierda. El puntero a la derecha se mueve al evento más reciente a más tardar (hora ptr izquierda + 1 hora). También mantenemos una variable suma que calcula el total de todas las duraciones de llamada en el intervalo.
En cada iteración movemos el puntero izquierdo para el próximo evento (la actualización de la suma en consecuencia), y luego avanzar con el puntero a la derecha (la actualización de la suma, otra vez) hasta su posición final (poco menos de 1 hora más tarde) .
El valor máximo de suma se obtiene en la ventana de hora ocupada.
No proporcioné detalles sobre cómo actualizar la variable de suma al mover los punteros, pero creo que no debería ser complicado hacerlo en tiempo constante.
La ventaja de este algoritmo es que no tiene el problema de granularidad, y que es lineal en el número de eventos.
--EDIT--
En realidad este es un O (N * log N) algoritmo, ya que la mesa de entrada no proporciona la clasificación de los acontecimientos que se supone. Necesitamos generar las listas ordenadas de eventos primero
¿No supone eso granularidad minuto? Pude imaginar algunos casos extremos difíciles en los que un volumen de llamadas que variaba segundo a segundo podía perderse. – PaulJWilliams
@Visage: así podría, así que asuma la granularidad de segundo, o la granularidad de milisegundos si eso es lo apropiado para su caso. De cualquier manera, solo tomará un par de minutos calcular. –
Dado que pasar de precisión minuciosa a precisión de milisegundos implicaría un aumento en la magnitud de 10^4 No creo que pueda cancelar la diferencia tan fácilmente. – PaulJWilliams