当前位置: 首页 > 知识库问答 >
问题:

查找定期重复出现的时间间隔是否相互重叠的算法?

许彭祖
2023-03-14

有多个重复的时间间隔,从开始时间到结束时间。每个间隔由重复的开始时间、结束时间(直到重复将要继续的点)、持续时间(当它处于活动状态且可以重叠时)和持续时间定义。

采样间隔:

startTime: 3 secs  
endTime: 30 secs  
onDuration: 3 secs (represented by x)   
offDuration: 5 secs (represented by -)  

|--[xxx]-----[xxx]-----[xxx]-----[xxx]-|

重叠间隔:如果两个重复序列的开始和结束时间范围内有重叠的开启时间(x),则称其为重叠。

问:这样的间隔有几十次。提供了一个由相同参数(startTime、endTime、onDuration、offDuration)定义的新重复间隔。在startTime和endTime的时间范围内,此新的重复间隔是否与任何现有间隔重叠?

潜在区间:

startTime: 6 secs  
endTime: 15 secs  
onDuration: 3 secs  
offDuration: 6 secs  

PotentialInterval与SampleInterval不冲突,因为它在重叠之前结束。

笔记:

>

  • 这与这个问题非常相似,但我无法完全理解解决方案的正确性。此外,我感兴趣的只是确定它们是否冲突(布尔值true或false),而不是实际的冲突间隔。

    每个间隔的结束时间和开始时间都构成一个算术级数。开始时间n=开始时间(n-1)(持续时间),其中开始时间n

    样本要小得多。事实上,每次复发的个体间隔数将为数千(例如,从现在到未来10年,每天下午3点到4点)。而且,复发的数量可能是数百。因此,对数据进行非规范化(列出每次发生的情况)可能不可行。

    此数据存储在非关系型数据库中,因此不可能在数据库中进行日期时间操作。这需要在内存中完成,并且最好在〜500毫秒的数量级

  • 共有1个答案

    卢聪
    2023-03-14

    我不认为有一个简单的公式/算法来确定两个序列是否重叠。我会详细说明一下。设s1=系列1的开始时间,a1=持续时间,b1=关闭持续时间,e1=结束时间,c1=a1 b1。让我们也有s2,a2,b2,c2和e2类似的序列2。问题是,序列的on周期是否重叠?

    设i1表示系列1的特定周期,i1

    那么问题是,我们能否找到整数i1和i2,使得区间[s1i1*c1,s1i1*c1a1]和[s2 i2*c2,s2 i2*c2a2]重叠?如m69所示,这相当于检查

    abs((s1+2*i1*c1+a1)/2 - (s2+2*i2*c2+a2)/2) < (a1+a2)/2
    

    我们有两种可能性,要么模下的表达式是正的,要么是负的。假设它是正的,那么我们有

    0 <= i1 <= m1
    0 <= i2 <= m2
    s1+2*i1*c1+a1 >= s2+2*i2*c2+a2,
    s1+2*i1*c1+a1 - (s2+2*i2*c2+a2) < a1 + a2
    

    0 <= i1 <= m1
    0 <= i2 <= m2
    i1 >= c2/c1*i2 + (s2-s1+a2-a1)/(2*c1)
    i1 < c2/c1*i2 + (2*a2+s2-s1)/(2*c1)
    

    (希望我没有在代数上犯任何愚蠢的错误)。我们得到另一个系统,假设模下的表达式是负的。

    这可能是一个最多有六条边的非空多边形。问题是,是否有整数值落在里面?这是一个丢番图线性不等式问题。如果你用谷歌搜索它,你会回到一个姐妹网站:)

    https://mathoverflow.net/questions/69966/algorithm-for-solving-systems-of-linear-diophantine-inequalities

     类似资料:
    • 问题内容: 我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的表和两个查询参数,并且,表达查询的最简单方法是什么,以便找到具有至少一个公共元素的所有行? 更新: 为了使预期结果更加清晰,请在下面找到输入值和预期结果的列表。列是 。 问题答案: 更简单:

    • 问题内容: 我在数据库中有2个表,这些表具有以下属性: 第二个表是“预订”和“资源”之间的关联实体(即1个预订可以包含许多资源)。属性booking_start和booking_end是带有日期和时间的时间戳。 我是否可以知道如果日期/时间与其他类似resource_id的预订重叠或冲突,我如何能够找到每个resource_id(预订的)? 我以图形方式在纸上涂上答案,以查看它是否可以帮助我形象化

    • 嗨,朋友们,我很难找到多个日期时间范围是否相互重叠,如果是,则它们重叠的时间段。我已经参考了以下链接 确定两个日期范围是否重叠 和 算法 以检测重叠的时间段等等。 不知道这是否正确,我有n=3的示例解释。 假设我有“n”开关 sw1,sw2 我遇到过这种可能性。可能还有更多。仍在寻找其他的。这里常见的时间段是从10:00到10:15即15分钟,10:20到10:30即10分钟。这些开关打开(“1”

    • 我创建了一个事件。现在我想检查它们是否重叠。我在数据库中以日期格式存储了开始时间和结束时间。 现在我想检查事件的时间是否重叠。为此,我想获取所有事件start Time和endTime,从日期检索小时和分钟,然后将小时和分钟与当前小时和分钟进行比较。 日期格式如下:df=新的SimpleDateFormat(“E-MMM-dd-HH:mm:ss-zz-yyyy”); 我第一次尝试通过查询比较两个日

    • 这与寻找重叠的间隔有关。给定一个间隔列表(间隔树),我知道如何做到这一点。我有一个间隔列表。例如, 结果应该是 [2,3], [7,8] 我需要做的是找到所有列表中常见的间隔列表。 我认为这个问题类似于合并列表。问题是我无法应用列表的成对合并。应用此方法可能会导致丢失重叠间隔。因此,我需要将所有列表合并在一起,一次考虑所有列表(而不是成对)。 我可以使用间隔树。将每个列表中的第一个间隔插入间隔树并

    • 问题内容: 我有一个包含以下字段的MySQL表: 名称 开始时间 时间结束 并且是MySQL 字段(不是)。我需要一种定期“扫描”表以查看表中时间范围是否重叠的方法。如果有来自和的其他事件,我想提醒您时间重叠。 真的没什么好想的,我只想知道是否存在重叠。 我将使用PHP执行此操作。 问题答案: 这是我很多年前找到答案的查询模式: 要找到“任何重叠”,您可以将时间范围的 相对 两端彼此进行比较。我必