给定间隔内1个未排序数组的元素差异

时间:2016-10-18 18:31:31

标签: arrays algorithm

假设我们有一个由整数组成的未排序数组。我们还有2个给定的整数,L和M.我们的任务是计算包含以下属性的所有(i,j)对的数量:L< = A [j] -A [i]< = M.

除了检查所有可能的对(O(n ^ 2)复杂度)的明显的强力算法之外,还有更快的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我假设你只需要计算不同对的数量,否则你不可能希望得到比O(n ^ 2)更好的最坏情况复杂性。

您可以在O(nlogn)时间内对数组进行排序,以跟踪原始数组索引。

然后只扫描已排序的数组并维护两个指针,使得它们指向的索引之间的所有元素在范围[L, M]中具有绝对差异。这部分可以在线性时间内完成。

答案 1 :(得分:0)

通过维持 order statistics trees ,可以在O(nlogn)中查找此类对的数量。

for each element x:
  find x-L (or closest and higher element) in the tree. Let its index be i1.
  finx x-M (or closest and smaller element) in the tree. Let its index be i2.
  element x is part of i2-i1+1 pairs where x is the higher from the prefix of the array.
  add this value to the sum.
  Repeat for x+L,x+M
  add x to the tree.

这是O(nlogn) ,每次添加和搜索都是O(logn)。这已完成n次,因此总共O(nlogn)

下限复杂度:在代数树模型下,它不能比O(nlogn)做得更好,因为这样做可以解决Omega(nlogn)中的element distinctness problem,这是Omega(nlogn)已知是不可能的。
因此,在这个模型下问题是<style> html,body { width: 100%; height: 100%; margin: 0px; padding: 0px; } #banner { background-image: black; /* For browsers that do not support gradients */ background-image: -webkit-radial-gradient(red, gray, black); /* Safari 5.1 to 6.0 */ background-image: -o-radial-gradient(red, gray, black); /* For Opera 11.6 to 12.0 */ background-image: -moz-radial-gradient(red, gray, black); /* For Firefox 3.6 to 15 */ background-image: radial-gradient(red, gray, black); /* Standard syntax */ width: 100%; background-position: center; background-repeat: no-repeat; background-size: cover; text-align: center; } </style> <header id="banner"> <img src="banner.png"/> </header>