c++ - 从两个数组中提取紧密对的更快方法?
问题描述
假设我有两个随机数组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};
我希望分别从两个数组中找到所有接近的对,其中两个 s 之间的差异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";
}
}
推荐阅读
- javascript - 如何仅禁用导航器屏幕之一的抽屉导航滑动?
- ios - 文本在 UILabel 内开始的位置
- php - 如何为没有数据的字段定义变量?
- racket - 如何检查 Racket 语法中是否存在关键字?
- android-studio - 可以使用颤振在 VS Code 和 Android Studio 中启动但无法连接到模拟器
- python - pd.read_json() 读取文件夹中的所有 json 文件
- node.js - elasticsearch不考虑#标签
- javascript - 如何从节点快递服务器下载文件?
- r - 如何在 R 中更改绘图工具栏的大小
- mockito - 在 mockito 中重置 mock 有什么作用?什么模拟状态被重置,什么保持不变?