什么是获得范围补充的最快方式?

时间:2011-08-03 12:19:57

标签: c# c algorithm

  

可能重复:
  Fastest way to get range complement

我有一个非重叠范​​围的排序数组,例如(0,2],(2,4),(6,9),我希望得到它的补码(0,12),它会返回(4,6) ],(9,12)。那是最快的方法吗?

3 个答案:

答案 0 :(得分:2)

假设您的输入数据是此表单的数组:

{ 0, 2, 2, 4, 6, 9 }

只需将新元素0和12添加到开头和结尾,即可

{ 0, 0, 2, 2, 4, 6, 9, 12 }

将连续对重新解释为间隔,你有:

  • (0,0)
  • (2,2)
  • (4,6)
  • (9,12)

你有退化间隔这一事实使得这有点混乱,但如果你的原始列表没有任何退化间隔,你的输出列表也不会。

根据您的数据格式以及您是否可以进行就地修改,此操作可能是O(1)

答案 1 :(得分:0)

我认为假设 n 为排序数组的大小需要O( n )。 因为你应该检查每个相邻范围之间的差距。

P.S。我想这是你的功课!

答案 2 :(得分:0)

  • 创建一个2 * n个数字的列表。 {a [0] .. a [2n-1]}通过合并所有间隔。它按建筑排序。
  • 忽略对(a [i],a [i + 1]),其中i为奇数,a [i] == a [i + 1]。
  • 在前面放置尽可能低的值。
  • 将可能的最高值放在后面。
  • 两个拼接,你得到补充。