【问题标题】:Efficient implementation of the Nearest Neighbour Search最近邻搜索的高效实现
【发布时间】:2012-04-19 22:35:00
【问题描述】:

我正在尝试为最近邻搜索问题实现一种有效的算法。

我看过一些数据结构的教程,这些数据结构支持这类问题的操作(例如,R-tree、cover tree等),但是所有这些都难以实施。

我也找不到这些数据结构的示例源代码。我知道 C++,我正在尝试用这种语言解决这个问题。

理想情况下,我需要描述如何使用源代码实现这些数据结构的链接。

【问题讨论】:

  • 您的数据的维度是多少?对于 2D 点数据,我建议使用 Kd-tree。这很容易实现。对于其他类型的数据/几何,您可能需要查看 R-trees(boost 1.54 支持 rtree 索引)

标签: c++ tree nearest-neighbor


【解决方案1】:

快速最近邻搜索库有几个不错的选择。

  • ANN,基于 Mount 和 Arya 的工作。这项工作记录在 S. Arya 和 D. M. Mount 的论文中。 “固定维度的近似最近邻查询”。在过程中。第四届 ACM-SIAM 研讨会。离散算法,第 271-280 页,1993 年。

  • FLANN,基于 Marius Muja & Co. 的工作。有一篇由 Marius Muja 和 David G. Lowe 撰写的论文,“Fast Approximate Nearest Neighbors with Automatic Algorithm Configuration” em>,2009 年国际计算机视觉理论与应用会议 (VISAPP'09)。FLANN 的代码可在 github

  • 上获得

FLANN 在某些情况下似乎更快,并且是更现代的代码版本,具有许多其他语言的可靠绑定,可以快速合并更改。如果您想要一个经过充分测试的可靠标准库,ANN 可能是一个不错的选择。

根据评论进行编辑

这两个库都有大量的文档和示例。

ANN 的示例代码可在Manual 中找到,在第 2.1.4 节中

FLANN 存储库examples directory 中提供了 FLANN 的示例代码,例如 /examples/flann_examples.c

【讨论】:

  • 如何使用它,例如我有 (x1,y1)(x2,y2)...(xn,yn)?
  • @dato - 答案已更新,包括指向每个项目文档中权威示例的链接。
  • 我需要安装 FLANN 库吗?
  • 是的,你会的。使用 FLANN(或 ANN)要求您在包含和库路径上提供适当的文件,就像使用任何其他重要的 C++ 库一样
  • @AndrewWalker 您能否将nanoflann 添加到答案中?它是 FLANN 的一个分支,而且速度明显更快。它是一个 C++11 头文件库,非常方便。谢谢和问候
【解决方案2】:

您可以尝试使用扫线算法来找到最近的一对点:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lineSweep。

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2013-07-22
    • 2013-08-12
    • 2011-05-04
    • 2018-06-16
    • 1970-01-01
    • 2011-10-23
    • 2015-11-16
    • 2012-04-15
    相关资源
    最近更新 更多