从另一组范围中剪切一组整数范围

时间:2013-05-16 18:49:42

标签: arrays algorithm

我有两种范围数组:

wanted = {[10, 15], [20, 25]}
cut = {[5, 12], [22, 24]}

所以wanted是一个包含两个元素(范围)的数组 - [10, 15][20, 25]

两个阵列中的每一个都满足以下条件:

  1. 按每个整数范围中的第一个值排序
  2. 范围永远不会重叠(例如[10, 15][15, 25]是不可能的)
  3. 这也意味着每个范围在数组中都是唯一的(无[1, 5][1, 5]
  4. 如果范围只是一个整数宽,则显示为[5, 5](开头和结尾相等)
  5. 我现在想要获取一系列范围,其中cut的所有范围都已从wanted的范围中删除。

    result = {[13, 15], [20, 21], [25, 25]}
    

    是否有比下面更好/更容易/更快的优秀算法?

      

    对于wanted中的每个元素,将该元素与cut之后的一个元素进行比较,直到cut中的元素从wanted的元素上方结束。

2 个答案:

答案 0 :(得分:2)

假设n中的wantedm元素中有cut个元素。

以下是执行所需任务的O(m + n)算法:

j = 1
result = {}
for i = 1:n
  // go to next cut while current cut ends before current item
  while j <= m && cut[j].end < wanted[i].start
    j++
  // cut after item, thus no overlap
  if j > m || cut[j].start > wanted[i].end
    result += (wanted[i].start, wanted[i].end)
  else // overlap
    // extract from start to cut start
    if cut[j].start > wanted[i].start
      result += (wanted[i].start, cut[j].start-1)
    // extract from cut end to end
    if cut[j].end < wanted[i].end
      result += (cut[j].end+1, wanted[i].end)
      j++

请注意,渐近地,你不能比O(m + n)做得更好,因为要证明你需要查看每个元素(在最坏的情况下)应该相当容易。

答案 1 :(得分:0)

wantedcut的最大尺寸是多少?将“wanted”中的“第一个元素”与“cut”中的“ all ”进行比较将花费O(n ^ 2)运行时间,即如果数组很大则非常慢。 / p>

并行处理每个数组要快得多,直到你到达两者的末尾,就像“合并”一样。