【问题标题】:how to find all numbers that there distance from given point are less or equall to integer n如何找到与给定点的距离小于或等于整数n的所有数字
【发布时间】:2019-02-04 18:08:09
【问题描述】:

给定一组点 D 和某个数字 K 我想找到 D 中的所有数字,使得 K 和任何找到的数字之间的距离小于或等于整数 N?

示例: 假设我们有 D={5,9,0,6,7} 和 K=8 和 N=1 那么结果应该是 {9,7}

我正在考虑使用 k-d 树或 VP 树,但据我所知(如果我错了,请纠正我)找到最近的邻居并且在我的示例中不关心 N。

【问题讨论】:

  • @dWinder 我只是在探索可能的方法,不包括蛮力搜索,所以没有时间复杂度限制
  • 如果是这样,为什么不对集合 D 进行迭代并检查每个点?这可以在O(n) 上完成,这在大多数情况下都很好——我的意思是你搜索的方法是否低于O(n)?您可以预处理为排序 D 吗?这将给O(logn+answer size)
  • @dWinder 假设我有非常大的数据集,我正在寻找更好的解决方案,比如 VP 树左右
  • 预处理是可能的,但请允许我更好地解释我想要找到的内容:对于大型数据集,而不是迭代 DI 中的每个元素想要和算法消除大量不需要的元素与n进行比较
  • 使用 VP 树将具有相同的时间复杂度(在 n*logn 构建树并在 logn 搜索与简单数组相同)

标签: search tree computer-science nearest-neighbor


【解决方案1】:

总结所有评论:

解决这个问题,因为蛮力将花费 O(n) 时间来迭代 D 中的每个元素,并检查它与 k 的距离是否小于 n

您有大数据集,但有很多查询最好在 D 上进行预处理(使用 O(nlogn) 并且您可以在 O(logn) 中得到答案 -> 通过将 D 排序为预处理(在O(nlogn) 作为凹坑排序的数组。

现在,在给定查询搜索k - 注意如果数字丢失,二分搜索将停止,但他确实停止在最接近的值。从该索引开始传播到 D 的两侧,并且每次检查是否仍在n 范围内。请注意允许中的传播,因为它包含O(|output|)

在您的示例中:已排序 D 产量:[0,5,6,7,9]。尝试查找 k=8 将给出错误但索引 3 或 4(取决于实现)。假设是返回索引 3。对于 3 到最后一个索引,检查 arr[i] - k < n 如果是这样打印 - 如果更大 stop。另一边检查k - arr[i] < n - 如果是这样打印,如果更大 stop -> 这会给你7,9

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2021-06-09
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多