有效地找到50k 2D坐标的n个最近邻居?

时间:2016-01-18 21:09:54

标签: algorithm

我有一个纬度和经度阵列。任务是找到所有坐标的5个最近坐标,而不是每次都遍历所有坐标。

1 个答案:

答案 0 :(得分:3)

有几种解决方案取决于您的数据(您没有告知任何内容)以及您希望的确切程度。

  • 如果您的数据是均匀分布的,那么您可以在数据之上创建网格并为网格指定点。之后,对于每个元素,您可以找出它所属的网格,并比较该网格中的距离(以及最近的网格中的距离)。通过良好的网格选择并假设网格中平均有k个元素,这可以为您提供潜在的void printSTDLines(char *lines) { int lineCount = strlen(lines), newLineCount = 0; while(newLineCount < 10) { if(lines[lineCount] == '\n') { newLineCount++; } lineCount--; } int readSize = strlen(lines) - lineCount; for(lineCount = readSize; lineCount < sizeof(lines); lineCount++) { write(STDOUT_FILENO, &lines[lineCount], 1); } } 运行时间。请查看more explanation的答案。
  • 对数据一无所知,你可以在O(n log n)时间构建一个2-d tree,然后在数据库中的每个点上询问最接近它的点(你在O中问这个( logn)总共n分)。因此总复杂度为O(n * k^2)
  • 另一种方法是使用名为local sensitivity hashing的概率方法。维基页面太复杂,甚至不知道这是什么,我很难阅读该页面。请查看this description以更好地理解它。
  • @Gene使用quadtree提出了另一种方法(没有听说过这种树,所以只留空)

因此,您可以看到此任务的复杂度可能高于O(n log n )

所有方法都描述了如何找到与您要搜索的点最近的点。很明显,在找到最近的点之后,你可以删除它并找到另一个最近的点,依此类推,直到找到5点最近的点为止。