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
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。