我想写一个算法,在尽可能短的时间内计算A[i] +A[j]〉B[i] + B[j](其中i〈j)的比较次数。
我知道蛮力法,但它需要O(n^2)时间,而我需要在更短的时间内解决它。我也探索了基于合并排序的方法,但它似乎不能正常工作
#include <algorithm> // for sort
int comparisons = 0;
// sort arrays A and B in ascending order
std::sort(A.begin(), A.end());
std::sort(B.begin(), B.end());
for (int i = 0; i < A.size(); i++) {
for (int j = i+1; j < A.size(); j++) {
if (A[i] + A[j] > B[i] + B[j]) {
comparisons++;
}
}
}
3条答案
按热度按时间8zzbczxx1#
将条件改写为
A[i] - B[i] > - (A[j] - B[j])
,问题就变成了C[i] > - C[j]
的检测,排序后,通过合并数组C
和求逆的数组-C
(不需要显式求逆,只需要调整索引),就可以轻松地解决这个问题,除非有更快的排序。g9icjywg2#
如注解中所述,关系对应于
C[i] > -C[j]
,其中C[i] = A[i] - B[i]
。在对
C
进行排序之后,计数变得很容易。我们只需要注意排除
i == j
的情况,并考虑到直接求和会使情况的数量加倍。复杂性主要取决于排序:时间复杂度O(n)
3zwjbxry3#
我已经做了下面的实现,但是在某些情况下,它给予的值比ans少1,我不知道为什么。这段代码中包含了一个这样的输入情况。