给定了一组点D和一些数字K,我想找到D中所有的数字,使得K与任何找到的数字之间的距离小于或等于整数N?
示例: 假设我们有D = {5,9,0,6,7}且K = 8且N = 1,则结果应为{9,7}
我当时正在考虑使用k-d树或VP树,但据我了解(如果我错了,请纠正我)找到最近的邻居,并且不在乎示例中的N。
答案 0 :(得分:0)
总结所有评论:
解决此问题,因为蛮力将花费O(n)
的时间遍历D中的每个元素,并检查其与k
的距离是否小于n
。
您有大数据集,但查询很多,最好对D进行预处理(使用O(nlogn)
,然后可以将D排序为pre,从而在O(logn)
->中得到答案。 -processes(在O(nlogn)
中为酒窝类型的数组。
现在,在给定查询中搜索k
-注意,如果缺少该数字,则二进制搜索将停止,但这样做将停止在最接近的值。从该索引开始扩展到D的两侧,并且对于每次检查是否仍在n
范围内。请注意,由于其中包含O(|output|)
,因此传播范围允许。
在您的示例中:对D
进行排序,得出:[0,5,6,7,9]
。尝试查找k=8
会得出false,但索引为3或4(取决于实现)。假设是返回索引3。对于3到最后一个索引,请检查arr[i] - k < n
是否打印-如果更大停止。对于另一面,请检查k - arr[i] < n
-如果这样打印,或者更大的 stop ->这将为您提供7,9
希望有帮助!