Given a list of time ranges, I need to find the maximum number of overlaps.
Following is a dataset showing a 10 minute interval of calls, from which I am trying to find the maximum number of active lines in that interval. ie. from the example below, what is the maximum number of calls that were active at the same time:
CallStart CallEnd
2:22:22 PM 2:22:33 PM
2:22:35 PM 2:22:42 PM
2:22:36 PM 2:22:43 PM
2:22:46 PM 2:22:54 PM
2:22:49 PM 2:27:21 PM
2:22:57 PM 2:23:03 PM
2:23:29 PM 2:23:40 PM
2:24:08 PM 2:24:14 PM
2:27:37 PM 2:39:14 PM
2:27:47 PM 2:27:55 PM
2:29:04 PM 2:29:26 PM
2:29:31 PM 2:29:43 PM
2:29:45 PM 2:30:10 PM
If anyone knows an alogrithm or can point me in the right direction, I would be grateful.
TIA,
Steve F
This seems like a
reduce
operation. The analogy is that each time a call is started, the current number of active calls is increased by 1. Each time a call is ended, the current number of calls drops to zero.Once you have that stream of active calls all you need is to apply a max operation to them. Here is a working python2 example:
You short the list on
CallStart
. Then for each element (i
) you see for allj < i
ifRest should be easy enough.
How about a naive approach:
I guess you could model this as a graph too and fiddle around, but beats me at the moment.
In my opinion greedy algorithm will do the needful. The problem is similar to find out the number of platforms required for given trains timetable. So the number of overlaps will be the number of platforms required.
callStart times are sorted. Start putting each call in an array(a platform). So for call
i and (i + 1)
, ifcallEnd[i] > callStart[i+1]
then they can not go in the same array (or platform) put as many calls in the first array as possible. Then repeat the process with rest ones till all calls are exhausted. In the end, number of arrays are maximum number of overlaps. And the complexity will beO(n)
.It's amazing how for some problems solutions sometimes just pop out of one mind... and I think I probably the simplest solution ;)
You can represent the times in seconds, from the beginning of your range (0) to its end (600). A call is a pair of times.
Python algorithm:
Note that I don't know which calls were active at this time ;)
But in term of complexity it's extremely trivial to evaluate: it's linear in term of the total duration of the calls.
The following page has examples of solving this problem in many languages: http://rosettacode.org/wiki/Max_Licenses_In_Use