Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何合并多个重叠的日期范围并创建新的日期范围?_Algorithm_Datetime_Go_Date Range_Dateinterval - Fatal编程技术网

Algorithm 如何合并多个重叠的日期范围并创建新的日期范围?

Algorithm 如何合并多个重叠的日期范围并创建新的日期范围?,algorithm,datetime,go,date-range,dateinterval,Algorithm,Datetime,Go,Date Range,Dateinterval,我有多个日期范围,每个范围都有一个开始和结束日期/时间,其中包含一个值,我想从中创建新的范围,其中重叠的范围值被附加到一个片段中 日期/时间范围如下: [10:00,10:15]=7 [10:10,10:20]=9 [10:05,10:25]=2 [11:00,现在]=3 为了更好地说明,请参见下图(为了简化,我在这里只使用了几次): 在图像上,日期范围[10:00,10:15]包含值7、[10:10,10:20]=9,依此类推 我需要生成以下日期范围,其中重叠的范围值合并在一起: [10:0

我有多个日期范围,每个范围都有一个开始和结束日期/时间,其中包含一个值,我想从中创建新的范围,其中重叠的范围值被附加到一个片段中

日期/时间范围如下:

  • [10:00,10:15]=7
  • [10:10,10:20]=9
  • [10:05,10:25]=2
  • [11:00,现在]=3
  • 为了更好地说明,请参见下图(为了简化,我在这里只使用了几次):

    在图像上,日期范围[10:00,10:15]包含值7、[10:10,10:20]=9,依此类推

    我需要生成以下日期范围,其中重叠的范围值合并在一起:

  • [10:00,10:05]=7
  • [10:05,10:10]=7,2
  • [10:10,10:15]=7,2,9
  • [10:15,10:20]=2,9
  • [10:20,10:25]=2

  • [10:25,11:00]=2这是一个算法的草图:

    数据结构将是:

    type Boundary struct {
       Time time.Time
       AddRemove int
       Value int
    }
    
    边界
    表示在给定时间从值列表中添加或删除的
    值。对于范围:

    [from,to]=number
    
    您可以创建两个
    Boundary
    对象:

    b1:=Boundary{Time:from,AddRemove: 1, Value: number}
    b2:=Boundary{Time:to,AddRemove:-1,Value:number}
    
    然后可以按时间和
    AddRemove
    对所有边界对象进行排序。如果时间相等,则应先处理添加,然后再删除。完成此操作后,可以处理边界对象并创建范围:

    last:=time.Time{}
    values:=map[int]struct{}{}
    for _,b:=range boundaries {
       if last.IsZero() {
          last=b.Time
          values[b.Value]=struct{}{}
       } else {
          // Create a new range here with [last,b.Time] with values given in `values`
          if b.AddRemove==1 {
            values[b.Value]=struct{}{}
          } else {
            delete(values,b.Value)
          }
          last=b.Time
       }
    }
    

    下面是一个算法的草图:

    数据结构将是:

    type Boundary struct {
       Time time.Time
       AddRemove int
       Value int
    }
    
    边界
    表示在给定时间从值列表中添加或删除的
    值。对于范围:

    [from,to]=number
    
    您可以创建两个
    Boundary
    对象:

    b1:=Boundary{Time:from,AddRemove: 1, Value: number}
    b2:=Boundary{Time:to,AddRemove:-1,Value:number}
    
    然后可以按时间和
    AddRemove
    对所有边界对象进行排序。如果时间相等,则应先处理添加,然后再删除。完成此操作后,可以处理边界对象并创建范围:

    last:=time.Time{}
    values:=map[int]struct{}{}
    for _,b:=range boundaries {
       if last.IsZero() {
          last=b.Time
          values[b.Value]=struct{}{}
       } else {
          // Create a new range here with [last,b.Time] with values given in `values`
          if b.AddRemove==1 {
            values[b.Value]=struct{}{}
          } else {
            delete(values,b.Value)
          }
          last=b.Time
       }
    }
    


    我想你需要为此编写自己的算法。通常,这种类型的算法开始按元组的第一个值对范围进行排序,然后遍历它们,将它们堆叠在堆栈中,分析交集并生成新的交集(如果需要弹出并计算它们,也可以将其保存在堆栈中)检查此项,例如,或任何范围日期时间序列。我记得用B-树写了一个算法来合并数据库中的日期时间序列。我知道这更像是一个算法问题,如果有人能帮我的话,我就把它贴出来了。我没有完成我的想法,就把那愚蠢的第一句话贴了出来:)@Luchux没问题:)你有没有试过任何你能在这里展示的东西?我想你需要为此编写自己的算法。通常,这种类型的算法开始按元组的第一个值对范围进行排序,然后遍历它们,将它们堆叠在堆栈中,分析交集并生成新的交集(如果需要弹出并计算它们,也可以将其保存在堆栈中)检查此项,例如,或任何范围日期时间序列。我记得我用B-树写了一个算法来合并数据库中的日期时间序列。我知道这更像是一个算法问题,我发布了它,如果有人能帮助我,我就发布了那愚蠢的第一句话,但没有完成我的想法:)@Luchux没问题:)你尝试过任何你能在这里展示的东西吗?这对我不起作用,值映射总是空的,请参见:或者我弄错了?您应该创建并存储新的范围,其中的注释是
    创建一个新的…
    。请参见:在第38行的示例中,您添加的Printf中,新范围给出了错误的开始时间,它总是10:00,结束时间是好的,因此它是[10:00,10:10]=7,[10:00,10:15]=7,9和。[10:00,10:20]=9应该是[10:00,10:10]=7,[10:10,10:15]=7,9和[10:15,10:20]=9固定的。请添加
    last=b.Time
    pls。这对我不起作用,值映射总是空的,请参见:或者可能我弄错了?您应该创建并存储新的范围,其中的注释是
    创建一个新的…
    。请参见:在第38行的示例中,您添加的Printf中,新范围给出了错误的开始时间,它总是10:00,结束时间是好的,因此它是[10:00,10:10]=7,[10:00,10:15]=7,9和。[10:00,10:20]=9应该是[10:00,10:10]=7,[10:10,10:15]=7,9和[10:15,10:20]=9固定的。添加
    last=b.Time
    pls。