目前,我在设计一个新功能时遇到了一些困难。它是资源管理系统的一部分。我想知道是否有人有类似的经验。
我试着解释:
资源:人、地方或事物
可用性模板(AT):允许您为某一类型的资源定义标准可用性模式。例如:星期一-星期五9-5。
资源附加可用性(AA):允许您定义资源的一次性可用性。鲍勃星期六加班10-3。
资源可用性排除(AE):允许您定义资源不可用的时间。例句:4号房间在周五4点到5点之间打扫.
很容易检查某个资源在某个时间点上是否可用: Availability = ( at (rID,time) x- AA(rID,time)) & !AE(rID,time)。
但我需要能够在一段时间内查询资源的可用性。即:“星期四上午9点开放2小时吗?”
到目前为止,我已经创建了一种算法,在特定的时间间隔内对可用性进行“采样”。但是,这意味着返回的可用性落后于实际可用性,可能会遗漏一些信息。
例句:如果我在9点到11点之间每15分钟取样一次,就会错过9:05到9:10之间的排除。
我可以用一个非常小的抽样周期(例如:1分钟),但这可能不是表演,而且总的来说,这仍然是一个相当丑陋的蛮力方法。
对于这类问题,是否有任何标准模式或算法?
发布于 2016-01-14 16:49:00
首先,将问题简化为“每天”的可用性测试。所有示例只使用范围一天,但如果您也希望支持“周一10:00至周三14:00”这样的范围,请将其分解为“周一10:00至23:59”、“周四00:00至23:59”和“星期三00:00至10:00”的三个测试。
对于每一天,以间隔列表的形式存储可用时间的间隔表示。最初,列表只包含一个间隔,假设每一天都是[9:00 , 17:00]
,每当一天的某个部分因不同的间隔而被阻塞(例如,10:00到11:25之间的空间被阻塞),就可以计算出新的产生的间隔列表(这里是[9:00,10:00]
,[11:25, 17:00]
)。额外的可用性会导致某些日期的额外间隔,而“可用性检查”只不过是一个新的时间间隔与特定一天的所有“可用时间”间隔的重叠测试。
因此,就集合而言,您所需要的只是间隔上的“减法”操作、“联合”操作和重叠测试。
实现两个区间的重叠测试并不困难,它不需要任何“抽样”,只需比较每个区间的最小值和最大值。以看这里为例。创建区间合并,或者“减法”间隔也不是太复杂,请看这里,请注意,两个区间的“集合差”产生两个新的区间、一个新的间隔或零的间隔。在第二个链接中,您还将找到Python中对interval包的引用。如果您不想自己实现这一点,我想每种主要编程语言都有类似的组件或代码片段可供使用。
https://softwareengineering.stackexchange.com/questions/307409
复制相似问题