假设我们有一个由整数组成的未排序数组。我们还有2个给定的整数,L和M.我们的任务是计算包含以下属性的所有(i,j)对的数量:L< = A [j] -A [i]< = M.
除了检查所有可能的对(O(n ^ 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>
。