我是一位帮助组织会议的IT人员/数学极客。会议期间活动的时间(但不是几天)是一成不变的。例如,我们知道某一事件将在某一天下午1点到3点之间发生。我正在尝试编写一个脚本,确定我们可以运行会议的最少天数,并且没有重叠事件。
所有事件都在一天内发生;没有事件的时间跨越12点或跨越几天。
我在这个问题上的第一个镜头涉及将其建模为无向图。我们可以将事件表示为顶点,两个顶点之间的边标记两个事件重叠。然后,问题被简化为找到图形的最小色数 - 在确保每个边缘的端点颜色不同的同时,为顶点着色所需的颜色数量最少。
但是,我无法开发一种在多项式时间内运行的高效动态编程算法来计算色数。
还有其他潜在客户吗?这似乎是NP完全问题,但我敢打赌,我们可以通过巧妙的时空权衡(即动态规划)在多项式时间内解决它。
答案 0 :(得分:5)
由于您的图表是interval graph,因此对于使用扫描线算法的常规图表来说,问题更容易解决。假设您的事件表示为元组(s_i, f_i)
,其中s_i
是事件的开始时间,f_i
是结束时间(以小时为单位)。
然后您可以使用以下算法:
events := union of {(f_i, -1), (s_i, 1)} for all i
sort events lexicographically
answer := 0
count := 0
for (time, c) in events:
count += c
answer := max(answer, count)
return answer
时间复杂度:O(n log n)
甚至O(n)
如果我们假设有可能的次数(实际上可能是这种情况)。
答案 1 :(得分:1)
就图表而言,这不是NP问题 - 它是critical path,但我没有看到任何提及事件彼此相关(即未定义事件的顺序),以解决这个问题< / p>
所以,实际上是O(N)问题