I am working on an event system which is basically a container with 720px height with each pixel representing one minute from 9AM to 9PM and has width of 620px (10px padding
If I understand you correctly, the input is a list of events with start and end times, and the output is, for each event, the column number of that event and the total number of columns during that event. You basically need to color an interval graph; here's some pseudocode.
For each event e
, make two "instants" (start, e
) and (end, e
) pointing back to e
.
Sort these instants by time, with end instants appearing before simultaneous start instants.
Initialize an empty list component
, an empty list column_stack
, a number num_columns = 0
, and a number num_active = 0
. component
contains all of the events that will be assigned the same number of columns. column_stack
remembers which columns are free.
Scan the instants in order. If it's a start instant for an event e
, then we need to assign e
a column. Get this column by popping column_stack
if it's nonempty; otherwise, assign a new column (number num_columns
) and increment num_columns
(other order for 1-based indexing instead of 0-based). Append e
to component
. Increment num_active
. If it's an end instant, then push e
's assigned column onto column_stack
. Decrement num_active
. If num_active
is now 0, then we begin a new connected component by popping all events from component
and setting their total number of columns to num_columns
, followed by clearing column_stack
and resetting num_columns
to 0.