multidimensional-array - 在空间数据库中查找 K 个最近的对(无特定查询对象)
问题描述
输入:
• N 点{P1, .... , Pn} - 每个点都来自相同的维度 t:
- Pi = {x_1, ...., x_t} 其中 k 在 18-30 之间。
• 距离函数——dist(Pi, Pj) ——返回一个数字,表示点之间的距离。(该函数是一个自定义函数——不是标准的 Minkowski 距离)。
问题:
• 主要问题:
- 尽可能快地从所有 N 个点中找到 K 个最接近的对。
• 次要问题:
- 给定一个点 Q = {x_1, ..., x_t} 返回 K 个最接近的对。
• 很高兴拥有:
- 我们可以在其中添加/删除点 Pi 的数据库,上述查询将尽可能快地运行。
相关数据结构:
• KD-树
• R-树
• 球树
可能的解决方案:
• 主要问题:
构建一个 BallTree (sklearn.neighbors.BallTree)。
对于 BallTree 中的每个点 P,找到 K 个最接近的对(现在我们有 N 个列表——每个列表包含每个点 Pi 的 K 个最接近的对)。
从上面的所有列表中选择最好的 K 对。
• 次要问题:
构建一个 BallTree (sklearn.neighbors.BallTree)。
查询给定点 Q 的最近 k 对。
到目前为止的时间复杂度:
对于树中的每个点(总共 N 个),找到 K 个最接近的对,它们取 O(K*log(N)) -所以总共 O(N * K * log(N))。
从 N 个排序列表中取出最好的 K 对 - 可以取O( Max{ K * log(K), N } )。例如,保持大小为 K 的最小 HEAP。
目前,总复杂度为O(N * K * log(N)) - 我们能做得更好吗?
解决方案
推荐阅读
- sql - 添加约束中缺少右括号错误
- android-architecture-navigation - 如何使用 NavigationUI 将参数传递给从 NavigationDrawer 调用的片段?
- angular - Angular 7 - 使用 ngTemplateOutlet 构建组件库时出错
- r - 基于单独数据框 (R) 的子集数据
- batch-file - 将参数传递给参数
- html - 如何根据内容调整绝对子元素的大小,包括大于父元素?
- java - Java 8 Hashmap 内部结构
- ios - Xcode 不允许我对 UIView 使用 NSObject 的 init() 函数
- python - 使用 pandas 获取聚合行值的样本
- c# - HasAlternateKey 允许重复输入