【问题标题】:Find overlapping ranges between two int arrays and split/insert them查找两个 int 数组之间的重叠范围并拆分/插入它们
【发布时间】:2021-02-24 09:26:40
【问题描述】:

有两个数组,每个数组总是包含一个偶数(虽然不等于)个整数,所以每一对都会形成一个范围,例如。 1..5、8..12等

var defaultArray: [Int] = [1, 5, 8, 12]
var priorityArray: [Int] = [1, 3, 5, 10, 13, 20]

我正在寻找的是一个通用算法,它将找到 priorityArray 的范围与 defaultArray 的范围重叠的每次出现的位置,并将插入 priorityRangedefaultArray 中,必要时将 defaultRange 分开。

目标是在保持原始“类型”的同时拥有一个组合范围数组,如下所示:

var result: [Int] = [
    1, 3,   // priority
    3, 5,   // default
    5, 10,  // priority
    10, 12, // default
    13, 20  // priority
]

我将使用一个简单的结构来说明最终想要的结果:

var result: [Range] = [
   Range(from: 1, until: 3, key: "priority"),
   Range(from: 3, until: 5, key: "default"),
   Range(from: 5, until: 10, key: "priority"),
   Range(from: 10, until: 12, key: "default"),
   Range(from: 13, until: 20, key: "priority")
]

【问题讨论】:

  • 你能举出更多的例子来涵盖所有可能的情况吗?我认为这是非常直接的。
  • 也可能存在优先级范围 4..6 介于默认范围 2..10 之间的情况,因此您必须添加 4、4、6、6 的总数[2, 4, 4, 6, 6, 10],但这里的关键是要知道给定范围是组合数组中的优先级还是默认值。
  • 默认范围可以相互重叠吗?可以优先级范围吗?
  • 我不确定你所说的相互重叠是什么意思。范围是通过在数组中以 2 为增量跨步创建的,因此无论整数本身如何,只要数组包含偶数个条目,就有一个有效范围。或者您可能会问数组是否总是按升序排序?
  • 例如 [1,10, 3,12] 是有效的默认范围吗?我在想象一个范围 lo,hi 你的意思是一个 set { x | lo 重叠

标签: arrays algorithm sorting pseudocode


【解决方案1】:

我们从数组defprio 开始,首先检查间隔本身是否按它们的起点/终点排序。然后,这些数组将在第一个数组位置包含最小的数字。确保这些数组简单/正确(=没有重叠间隔)。如果不是,您可以简化/清理它们。

然后我们初始化

  • 数组索引d=0 来索引def 数组
  • 数组索引p=0 来索引prio 数组
  • 一个新数组result 用于保存所有新创建的区间。
  • 一个变量s=none来保存当前状态

我们现在确定def[d]prio[p] 之间的关系。 如果def[d]prio[p],我们设置t=def[d],递增d并设置s=def。 如果def[d]>prio[p], we set t=prio[p],增加p并设置s=prio。 如果它们相等,我们设置t=prio[p],递增pd 并设置s=both

我们现在可以使用 start=def[0]result 数组初始化一个新条目。优先级是def(如果s==def)或prio(如果sprioboth)。要确定结束,您可以再次比较 def[d] 和 prio[p] 以确定它应该在哪里结束。此时,您应该再次调整s,但确保跟踪您所处的正确状态(从bothdefprionone,具体取决于它们之间的关系def[d]prio[p])。正如 OP 的 cmets 中所述,不同的可能性可能需要更多说明,但您应该能够将它们合并到一个状态中。

从那里开始,您可以继续迭代和调整变量,直到两者都完成(使用 d=len(def)p=len(prio)。您最终应该得到一个包含所有所需合并间隔的漂亮数组。

这基本上是对 2 个数组的有状态扫描,跟踪整数范围内的当前位置并一次推进 1(可能 2)个位置。

【讨论】:

  • 感谢您的努力,但我不确定我是否完全理解您的回答。在确定 def[d] 和 prio[p] 之间的关系时,您能否澄清一下您在循环哪个数组?
  • 您实际上同时迭代了 def 和 prio 数组。您从 0 开始 d 和 p。根据 def[0] 和 prio[0] 之间的关系,您执行适当的操作(见上文),包括更新 s 和结果数组以及递增 d 或 p (或两者兼有)。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多