用于在范围中查找重叠的更高内存效率算法

时间:2017-02-04 05:31:05

标签: c++ algorithm memory-management stl

this问题中,答案包括一个算法,用于查找给定范围上的范围列表的重叠。但在我的情况下,我有一个n整数列表,当它们被分组为n^2对形式范围时。例如,如果我们从整数数组中取array[i]array[j](array[i]-array[j],array[i]+array[j])会生成一个范围。但是为了实现建议的算法,解决方案具有O(n^2)内存复杂度。它可以进一步优化(在内存方面)吗?

实施例: 我有一个更大的范围(l,r),我必须找到(l,r)中至少有多少整数位于范围列表中的任何一个。例如,给定的整数数组是{1,2,3} 。所有可能的范围都是(2-1,1+2), (3-1,1+3), (3-2,3+2)。假设(l,r)(2,7)。然后由于(2,5)中至少存在4^\{(.*?)(?:[a-zA-Z_])\}$ 就是答案。

1 个答案:

答案 0 :(得分:2)

首先对数组进行排序(如果尚未排序)。然后请注意,唯一值得考虑的范围是j == i-1

要理解为什么要考虑以下数组:

{2,3,5,8}

然后可能的范围是:

i=3 j=2 ==> (8-5,8+5) = (3,13)
i=3 j=1 ==> (8-3,8+3) = (5,11)
i=3 j=0 ==> (8-2,8+2) = (6,10)

i=2 j=1 ==> (5-3,5+3) = (2,8)
i=2 j=0 ==> (5-2,5+2) = (3,7)

i=1 j=0 ==> (3-2,3+2) = (1,5)

请注意,j < i-1的范围始终是j == i-1范围内的严格子集,因此不需要考虑这些范围。所以你只需要考虑O(n)范围。