按欧几里得距离排序


17

S是平面上的一组点。随机点xS是在同一平面上给出。任务是要排序的所有yS通过之间欧氏距离xy

无脑方法是计算之间的距离xy所有yS,然后排序它们使用任何快速算法。

有什么方法可以存储或预处理S从而使分类过程变得更快?


1
您可以考虑使用适当大小的网格,并通过相应的正方形(例如使用哈希表)将点分组。然后,对于某些成对的正方形,您可以推断出一个正方形中的所有点比远于另一正方形中的所有点。我想在实践中它可能会有所帮助。x
ilyaraz 2011年

您所说的“无脑方法”运行时间为O(n log n),其中n是S中的点数,我认为实际上这是非常快的。您是否要避免使用log n因子,还是需要其他诸如外部排序之类的功能
伊藤刚(Tsuyoshi Ito)

关键是我几乎没有时间准备我的一组要点,但是对它们进行排序的时间非常有限。就是说,标准排序的任何加速都值得赞赏-即使它是相同的O(n log n),但在最坏情况(或最佳情况,或其他任何情况)下都更快。
Alex K.

例如,如果我将S存储为2-d树,则可以在O(log n)时间找到一个最近的邻居。也许对于我的任务有一个类似的解决方案。我不是空间数据结构方面的出色专家-而且其中有很多-我很容易就错过了。
Alex K.

Answers:


13

解决方案1:找出点对之间的垂直平分线,并构造这些线的排列。该布置具有Θ n 4)个单元,其排序顺序是恒定的。因此,为该布置构建点位置数据结构,并使用要为该单元中的点返回的排序顺序来装饰每个单元。相邻单元格之间的排序顺序仅在单个换位中有所不同,因此您可以使用持久性数据结构来允许这些排序顺序的表示形式共享空间。总空间为O n 4,查询时间为OΘñ2Θñ4Øñ4O(logn)

解决方案2:从这些相同的垂直平分线中随机选择一个样本,构建其排列,并通过两条采样线的每次交叉按垂直线段划分每个排列单元。所得的分区具有Θ n 2)个像元,每个像元都有很高的概率被O n )个非采样平分线所交叉。从单元格中的某些x角度来看,按点的有效排序顺序装饰分区的每个单元格。总空间为O n 3Θ(n)Θ(n2)O(n)O(n3)

现在,要进行查询,请在分区中找到查询点,查找与分区单元格一起存储的顺序,并使用Levcopoulos&Petersson(1989)的笛卡尔树比较排序算法从此存储的顺序开始。该步骤的时间与成比例,其中k i是与点y i乱序的点数。但是k iO n (每个未采样的等分线最多导致一对无序点),因此查询时间iO(1+logki)kiyikiO(n)也是 O n iO(1+logki)O(n)


1
PS:这是解决方案2的另一种变体,它使用相同的空间和查询时间,但为更简单的查询算法而权衡了更复杂的预处理算法:11011110.livejournal.com/233793.html
David Eppstein

为什么可以在O n 2 log n )个时间中对所有n个起点进行排序并将结果存储在使用空间O n 2进行哈希表恒定查询的情况下,进行预处理?n4nO(n2logn)O(n2)
戴夫

因为存在具有不同排序顺序的起点,而不是Θ n 2Θ(n4)Θ(n2)
David Eppstein

1

您可能无法以任何方式切分时间。即使是与所有可能的排序顺序相对应的预计算区域也可以(我相信)产生O n )个区域,因此通过任何有意义的搜索技术找到“您的”区域都将使O log n = O n log n 时间。(编辑:nlog(n)O(n!)O(log(n!))=O(nlog(n))这是绝对错误的;另一方面,请参阅David Eppstein的出色答案!)另一方面,这是一种降低复杂度的有用方法-特别是如果您不需要一次完整排序,而只需要能够随机抽取最近的动态-可能是通过高阶Voronoi图进行的:标准Voronoi单元的扩展不仅适用于最近的邻居,而且适用于第二近邻等。Frank Dehne关于k最近邻搜索的论文,http://people.scs .carleton.ca /〜dehne / publications / 2-02.pdf似乎是规范的参考;他在http://www.dehne.carleton.ca/publications上的主页上还有许多其他有关Voronoi图的论文,这些论文可能有用。k


3
如果将一个平面划分为具有不同排序顺序的区域,则存在区域,而不是O n 。区域之间的边界是成对的点的垂直平分线,有Θ n 2这样的线,并且区域的集合由这些线的排列给出。Θ(n4)O(n!)Θ(n2)
David Eppstein

@David我想你应该把这个作为答案。
詹姆斯·金

借调-n!在编写时感到不对,但我看不到反对的理由。我将很快修改我的答案以纠正该问题,但我真的很想看到一个更直接的信息;谢谢!
Steven Stadnicki 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.