所以问题是这样的:
给定位置X和位置数组,我想获得一个数组 最靠近位置X的位置,换句话说,排序方式 最近距离。
我解决这个问题的方法是迭代每个位置数组并计算X与特定位置之间的距离,存储该距离,并使用比较器按距离对位置进行排序。完成!有一个更好的方法吗?假设排序是合并排序,它应该是O(n log n)。
答案 0 :(得分:2)
如果我理解这一点,你可以很快地为多个查询做到这一点 - 例如,给定几个X值,你不必每次都对解决方案数组进行重新排序。这是你如何做到的:
对于具有O(nlogn)预处理的每个查询,这需要O(n + logn)。当然,如果我们只讨论一个X,那就不是更好了。
答案 1 :(得分:2)
您描述的问题对我来说听起来像m
-nearest neighbor search。
所以,如果我正确地理解了你的问题,即location
在多维度量空间中是一个向量的概念,并且distance
是这个空间中的适当度量,那么它将是很高兴将array of locations
放在k
-d-Tree中。
树构建一次有一些开销,但是你可以搜索O(log n)
。
这样做的好处是,假设您只对m < n
最近的可用位置感兴趣,则每次搜索新的n
时都不需要评估所有X
距离
答案 2 :(得分:0)
您应该尝试使用min-heap ds来实现此目的。只需使用key = diff of X和该位置
继续存储堆中的位置答案 3 :(得分:0)
如果使用基于比较的排序,则不能渐近地优于O(n log n)。但是,如果你想谈论代码的微优化,一些想法包括......
一种思维方式的解决方案可能是使用例如Bucket sort ...一种线性时间排序算法,可能适用于此处。
答案 4 :(得分:0)
通过矛盾证明你无法做得更好:
众所周知,基于比较的排序是对任意数字进行排序的唯一方法(可能包括无理数),并且它们不能比n * log(n)时间更好。
如果你在O(n)时间内浏览列表并选择最小的数字,然后将其用作X,并以某种方式得出按距离X排序的数字列表,那么你已经排序了n个数字小于O(n * log(n))时间。