Arrays 查找两个整数数组之间的重叠范围并拆分/插入它们
有两个数组,每个数组始终包含偶数(尽管不相等)个整数,因此每对数组将形成一个范围,例如1..5、8..12等Arrays 查找两个整数数组之间的重叠范围并拆分/插入它们,arrays,algorithm,sorting,pseudocode,Arrays,Algorithm,Sorting,Pseudocode,有两个数组,每个数组始终包含偶数(尽管不相等)个整数,因此每对数组将形成一个范围,例如1..5、8..12等 var defaultArray: [Int] = [1, 5, 8, 12] var priorityArray: [Int] = [1, 3, 5, 10, 13, 20] 我要寻找的是一种通用算法,它可以找到priorityArray中的某个范围与defaultArray中的某个范围重叠的情况,并将priorityRange插入defaultArray中,同时在必要时将defau
var defaultArray: [Int] = [1, 5, 8, 12]
var priorityArray: [Int] = [1, 3, 5, 10, 13, 20]
我要寻找的是一种通用算法,它可以找到priorityArray中的某个范围与defaultArray中的某个范围重叠的情况,并将priorityRange插入defaultArray中,同时在必要时将defaultRange分开
目标是在保持其原始“类型”的同时拥有一个组合范围数组,如下所示:
我将使用一个简单的结构来说明最终的预期结果:
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")
]
我们从那些数组
def
和prio
开始,首先检查间隔本身是否按照其起点/终点排序。这些数组将在第一个数组位置包含最小的数字。确保这些数组简单/正确(=没有重叠间隔)。如果没有,您可以简化/净化它们
然后我们初始化
- 数组索引
为d=0
数组编制索引def
- 数组索引
为p=0
数组编制索引prio
- 一个新的数组
,用于保存所有新创建的间隔result
- 保存当前状态的变量
s=none
def[d]
和prio[p]
之间的关系。
如果def[d]
prio[p],我们设置t=prio[p],递增p
并设置s=prio
。
如果它们相等,我们设置t=prio[p]
,递增p
和d
,并设置s=both
现在,我们可以使用start=def[0]
为结果
数组初始化一个新条目。优先级为def
(如果s==def
)或prio
(如果s
是prio
或两者都是)。要确定结束,您可以再次将def[d]与prio[p]进行比较,以确定其结束位置。此时,您应该再次调整s
,但要确保跟踪您所处的正确状态(从both
到def
,prio
或none
,具体取决于def[d]
和prio[p]
之间的关系)。正如OP评论中提到的,不同的可能性可能需要更多的澄清,但你应该能够将它们纳入一个状态
从这里开始,您可以不断迭代和调整变量,直到两者都完成为止(使用d=len(def)
和p=len(prio)
。您应该得到一个包含所有所需合并间隔的漂亮数组
这基本上是对2个数组的有状态扫描,在整数范围内跟踪当前位置,并前进1(可能2)个位置一次。你能给出更多的例子来涵盖所有可能的情况吗?我认为这很简单。也可能有一种情况,即优先级范围4..6在默认范围2..10之间,因此你必须添加4,4,6,6,总共[2,4,4,6,6,10],但这里的关键是要知道给定的范围在组合数组中是优先级还是默认值。默认范围可以相互重叠吗?优先级范围可以相互重叠吗?我不确定您所说的重叠是什么意思。范围是通过在数组中跨步递增2来创建的,因此无论整数本身如何,就像lon一样由于数组包含偶数个条目,因此存在一个有效范围。或者您可能会问数组是否总是按升序排序?例如,[1,10,3,12]是否是有效的默认范围?我想象的是一个范围lo,hi,您指的是一个集合{x |感谢你的努力,但我不确定我是否完全理解你的答案。你能澄清一下,当你确定def[d]和prio[p]之间的关系时,你是在循环哪个数组吗?实际上,你同时迭代def和prio数组。你从d和p都在0开始。这取决于def[0]之间的关系和prio[0],执行适当的操作(参见上文),包括更新s和结果数组以及递增d或p(或两者)。
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")
]