algorithm - 用 O(nlogn) 时间解决问题

标签 algorithm

设 A[1]<=A[2]<=....<=A[n]。令 X 为任意数。给出一个算法找到所有 A[i] 和 A[j] 对,使得 A[j] - A[i] >= X。所有数字都是正整数。

如果想看原题。在这里:

令 P = {p1; p2; ; pn} 是二维空间中的一组 n 个点,其中对于每个 i,pi = (xi; yi)。令 D = (dx; dy)。问题是确定是否存在一对点 pi 和 pj 使得 xj - xi >= dx 和 yj - yi >= dy。通过考虑所有可能的点对,您可以在 O(n^2) 时间内轻松解决此问题。但是我们有兴趣开发一个 O(n log n) 时间算法。

最佳答案

在这里,您可以利用输入已排序且所有数字均为正整数这一事实。如果

A[j] - A[i] ≥ X

那么我们知道下面的也是成立的

A[j + 1] - A[i] ≥ X

所以算法可能是

for(i = 1; i < n; i++) // for every value (this part is O(n))
{
    int minJ = A[i] + X; // the minimum J that satisfies `A[j] - A[i] >= X`

    int cutoff = binarySearch(minJ); // figure out the minimum J for which  `A[j] - A[i] >= X` (this part is O(log(n))

    storeResults(i, cutoff, n); // In Answers[i], save every qualifying integer (this part is less than O(log(n))
}

总共有

O(n * (log(n) + 小于 log(n))
O(n * (2 log(n)))
O(n * log(n))

还有一些小优化的余地,比如只将主循环执行到 n - 1 而不是 n,但这并不重要或与 Big-哦。

关于algorithm - 用 O(nlogn) 时间解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3835647/

相关文章:

java - BFS : PriorityQueue not getting empty

algorithm - 如何将流程图转换为实现?

java - 对于两个值的中点以下的值,二进制搜索算法失败

algorithm - 对一个序列进行排序,但将某些特定元素按另一种顺序排序

c++ - 为第一个元素对数组进行排序的算法,然后是前 2 个元素,然后是前 3 个元素,依此类推

algorithm - 显示递归关系是 O(n log n)

计算字符串列表中出现次数的 Pythonic 方法

algorithm - 我将如何着手编写伪代码以在邻接矩阵中查找汇?

python - 用函数变换集合的高效算法

algorithm - 如何获得重叠集中的碰撞次数?