c++ - 从两个数组中提取紧密对的更快方法?

标签 c++ algorithm sorting

假设我有两个随机的 int 数组,比如说:

int A[] = {484, 834, 591, 23, 174, 248, 147, 765};
int B[] = {659, 805, 12, 180, 771, 386, 354, 568, 710, 312, 6, 848};

我希望分别从两个数组中找到所有接近的对,其中两个 int 之间的差异不大于某些固定的 k 例如 50:

(from A, from B)
(834, 805)
(834, 848)
(591, 568)
(23, 12)
(23, 6)
(174, 180)
(147, 180)
(765, 805)
(765, 771)

最简单的方法是使用嵌套的 for 循环:

for (int a : A) {
  for (int b : B) {
    if (abs(a - b) < k)
      // find (a, b)
  }
}

但这需要 O(n^2) 时间复杂度,而且似乎效率不高。有没有更好的方法来做到这一点,而不考虑空间成本?

最佳答案

您可以在 O(N log N) 中执行(+ 结果对的数量(可能超过 N log N)):

std::sort(std::begin(A), std::end(A)); // O(N log N)
std::sort(std::begin(B), std::end(B)); // O(N log N)

auto begin = std::begin(B);
auto end = begin;
for (auto v : A) {
    while (begin != std::end(B) && *begin < v - 50) ++begin;
    while (end != std::end(B) && *end < v + 50) ++end;
    for (auto it = begin; it != end; ++it) {
        std::cout << '(' << v << ", " << *it << ")\n";
    }
}

Demo

关于c++ - 从两个数组中提取紧密对的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64736037/

相关文章:

algorithm - 如何生成仅具有路径压缩的不相交集的最坏情况?

c++ - 这个 _com_ptr_t move 分配有什么目的吗?

c++ - 结构操作,代码不起作用?

algorithm - 浮点乘法是可交换的吗?

algorithm - 什么时候向后搜索比向前搜索更好?

javascript - 如何测试数组列中的单元格中的数字或字符串

python - 数据框如何按字母顺序将值从 a 排序到 b 而不是 aa

c++ - 是否可以使用 CUDA 来有效计算排序数组内元素的频率?

c++ - 接受者拒绝只为 -O0 构建打开套接字

c++ - 从 const 成员函数返回指向成员数组的指针