gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:28 24 4
gpt4 key购买 nike

设 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com