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

Data structures 快速方法计数间隔数组中的重叠间隔数?,data-structures,Data Structures,好的,这是我在高级算法课上得到的一个问题。我已经提交了一次解决方案,但由于效率问题被我的导师拒绝了,换句话说,我已经做出了努力,但即使在他的提示下也无法得到,所以请温柔一点。我将在下面给出他的提示 给定一个包含起点和终点的区间数组,找出每个区间内的其他区间数。间隔数小于10^9且其ID不同。开始和结束小于10^18,输入文件不包含开始和结束的重复编号。上面所有的数字都是整数 提示是:考虑使用bucket的数据结构。该算法应比O(n^2)快 数字相当大,所以O(N logn)可能有点大,但这里有一

好的,这是我在高级算法课上得到的一个问题。我已经提交了一次解决方案,但由于效率问题被我的导师拒绝了,换句话说,我已经做出了努力,但即使在他的提示下也无法得到,所以请温柔一点。我将在下面给出他的提示

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

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


数字相当大,所以O(N logn)可能有点大,但这里有一个想法

首先要规范化值,这意味着将它们变小,同时保持相同的顺序。在您的示例中,规格化是

 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
当你到达一个时间间隔时,你可以说所有在它之前开始的、还没有遇到的时间间隔的答案都应该增加1。这可以通过分段树来完成

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

我真的不认为你能用少于O(N logn)的时间和O(N)的内存来解决这个问题,所以这个解应该是时间和空间上的渐近最优解

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