【问题标题】:Algorithm for Intersection (or Merge) of Numerical Ranges数值范围的交叉(或合并)算法
【发布时间】:2017-12-09 12:18:22
【问题描述】:

假设我有一个这样的范围列表:

列表 A) 0 到 3、9 到 14

列表 B) 1 到 4、6 到 7、14 到 16

列表 C) 15(即 15 到 15)

我想获得这些范围的合并列表,结果如下所示:

合并结果列表)0 到 4、6 到 7、9 到 16

(注意结果是列表 A、B 和 C 的合并/交叉/联合)

我确信有一个算法可以解决这个问题,但不知道。有没有人遇到过这种情况?

(伪代码或 VB 会很棒)

添加视觉表示:

【问题讨论】:

  • 您想在单个列表中还是从所有列表中合并愤怒(然后按顺序)。另外,您的清单 C) “15” - 这是什么意思?单个值如何指定范围?
  • “15”是整个范围 - 它从 15 开始,到 15 结束。我想我可以这样写:15 到 15(我会更新问题以反映这一点)。结果是列表 A、B 和 C 的合并或联合/交叉。

标签: algorithm list merge range intersection


【解决方案1】:

制作数组/列表对(Value, Flag = +1 for start or -1 for end of range)

Value 对这些对进行排序(使用Flag 作为辅助键,以防出现平局)

制作Counter = 0

遍历排序数组,将Flag 添加到Counter

Counter 变为非零时,合并范围开始。

Counter 变为零时,合并范围结束

附:如果您想合并“接触”间隔 - 当Value 相同时,在比较器函数中考虑Flag - 例如,(14;+1)(14,-1) 之前

【讨论】:

  • 好主意 - 我试过了,结果很接近。这是我得到的结果:0 到 4、6 到 7、9 到 14、14 到 16
  • 为这种情况添加了解决方案
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2015-11-10
相关资源
最近更新 更多