按最近点排序位置数组

时间:2011-10-30 19:18:47

标签: algorithm

所以问题是这样的:

  

给定位置X和位置数组,我想获得一个数组   最靠近位置X的位置,换句话说,排序方式   最近距离。

我解决这个问题的方法是迭代每个位置数组并计算X与特定位置之间的距离,存储该距离,并使用比较器按距离对位置进行排序。完成!有一个更好的方法吗?假设排序是合并排序,它应该是O(n log n)。

5 个答案:

答案 0 :(得分:2)

如果我理解这一点,你可以很快地为多个查询做到这一点 - 例如,给定几个X值,你不必每次都对解决方案数组进行重新排序。这是你如何做到的:

  1. 最初对数组进行排序(O(n logn) - 调用此预处理)
  2. 现在,在每个查询X上,二进制搜索数组中的X(或最接近的数字小于X)。维护,两个指数,i和j,一个指向当前位置,一个指向下一个。其中一个显然是列表中最接近X的数字。选择较小的距离并将其放入解决方案阵列中。现在,如果我被选中,减少我 - 如果j被选中,增加j。重复此过程,直到所有数字都在解决方案数组中。
  3. 对于具有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)。但是,如果你想谈论代码的微优化,一些想法包括......

  1. 按平方距离排序;没有理由使用sqrt() - sqrt()是昂贵的
  2. 必要时仅计算平方距离; if | dx1 | &lt; = | dx2 |和| dy1 | &lt; = | dy2 |,pt1比pt2更接近 - 整数乘法很快,但在很多情况下避免它可能会更快一些
  3. 一种思维方式的解决方案可能是使用例如Bucket sort ...一种线性时间排序算法,可能适用于此处。

答案 4 :(得分:0)

通过矛盾证明你无法做得更好:

众所周知,基于比较的排序是对任意数字进行排序的唯一方法(可能包括无理数),并且它们不能比n * log(n)时间更好。

如果你在O(n)时间内浏览列表并选择最小的数字,然后将其用作X,并以某种方式得出按距离X排序的数字列表,那么你已经排序了n个数字小于O(n * log(n))时间。