快速方法计数间隔数组中的重叠间隔数?

时间:2013-08-21 21:17:46

标签: data-structures

好的,这是我的高级算法类的问题。我已经解决了我的解决方案,但由于效率问题我的导师拒绝了,换句话说,我已经做了我的努力但是在他的暗示之后无法得到它,所以请温柔。我将在下面给出他的提示

给定一个包含起点和终点的间隔数组,找出每个间隔内其他间隔的数量。间隔数小于10 ^ 9,它们的ID是不同的。 start和end小于10 ^ 18,输入文件不包含重复的开始和结束编号。以上所有数字都是整数

提示是:考虑使用桶的数据结构。该算法应该比O(n ^ 2)

更快
sample input and output

input:
5   %% number of intervals
2 100 200    %% id, start,end. all lines below follows this
3 110 190
4 105 145
1 90 150
5 102 198

output:
3 0
4 0
1 1
5 2
2 3

1 个答案:

答案 0 :(得分:1)

这些数字相当大,所以O(N log N)可能有点多,但这是一个想法。

首先要对值进行标准化,这意味着在保持相同排序的同时将它们缩小。在您的示例中,规范化将是

 90 100 102 105 110 145 150 190 198 200
  1   2   3   4   5   6   7   8   9  10

所以你的新间隔是:

5
2 2 10
3 5 8
4 4 6
1 1 7
5 3 9

现在,间隔的边缘在[1,2N]范围内。

现在按照结尾对间隔进行排序:

5
4 4 6
1 1 7
3 5 8
5 3 9
2 2 10

当你达到一个间隔时,你可以说在它之前开始并且还没有遇到的所有间隔都应该将它们的答案增加一。这可以通过SegmentTree来完成。

当您获得间隔[x,y]时,您将[1,x - 1]范围内的所有值增加1,然后将其答案计算为段树中x的值。这只是间隔和查询点上的一个常见的分段树问题。

我真的认为你可以用小于O(N log N)的时间和O(N)内存来解决这个问题,所以这个解决方案应该是时间和空间上的渐近最佳解决方案。