ANN库的使用
什么是ANN?
(1)ANN——Approximate Nearest Neighbor,是一个用 C++ 编程语言编写的库,
支持在各种维度的空间中进行精确和近似最近邻搜索。
(2)在最近邻问题中,给出d维空间中的一组数据点P,这些点被预处理成一个数据结构即kd树;
kd树的建立使我们能够对于任意查询点q,可以有效地找出p到q的最近点。
(3)ANN 是为足够小的数据集设计的,搜索结构可以存储在主存储器中(与假设数据驻留在
辅助存储器中的数据库方法相反)。假设点表示为实数(或整数)的坐标向量。两点之间的
距离可以通过多种方式定义。
ANN库使用的基本语法
//ANN库头文件
#include<ANN.h> ---开启ANN库的世界
// 给待处理数据构建一个数据结构(kd树)
ANNkd_tree::ANNkd_tree(
ANNpointArray pa, //数据点数组(待处理点)
int n, //数据点数量
int d); //空间维度(一般设为1)
//----------------------------------------------------------------------------------
//k近邻搜索两种方法
//法一:annkSearch
virtual void ANNkd_tree::annkSearch(
ANNpoint q, //查询点(目的就是要查询数据点中,点q的最近邻点)
int k, //要查找的邻近点数(可以自定义也可以利用法二计算)
ANNidxArray nn_idx, //查询到的q的最邻近点组成的数组(任选参数)
ANNdistArray dists, //最邻近点与点q的距离(任选参数)
double eps=0.0); //误差限
//对于数组nn_idx:查询到的q的最邻近点存储在数组nn_idx数组中,
//其中最近的存储在nn_idx[0],第二近的在nn_idx[1]中...以此类推
//对于数组 dists:存储的为相关点到点q的平方距离
//法二:annkFRSearch
virtual int ANNkd_tree::annkFRSearch(
ANNpoint q,
ANNdist sqRad, //查询半径的平方(自定义)
int k = 0, //邻近点个数,返回值
ANNidxArray nn_idx,
ANNdistArray dists,
double eps=0.0);
//与annkSearch()不同,annkFRSearch()没有优先搜索的功能,
//它是一个一个地访问搜索半径内的所有点,然后找到点q的最邻近点
//----------------------------------------------------------------------------------
//为ANNpoint分配存储空间
ANNpoint annAllocPt(
int dim, //空间维度
ANNcoord c=0); //初始的坐标值(任选参数)
//释放由 annAllocPt 分配的点 p 的存储空间并置 p 为 NULL
void annDealocPt(
ANNpoint& p);
示例程序
...
#include <fstream> //文件输入输出流
#include <ANN/ANN.h> //ANN声明
ANNpoint p = annAllocPt(1) //创建ann一维空间
ANNkd_tree point_tree(points,size,1) //构建kd树
int k = points_tree.annkFRSearch(p, r^2, 0); //返回邻近点个数
ANNidxArray nn_idx = new int[k];
ANNdistArray dd = new double[k];
points_tree.annkFRSearch(p,r^2,k, nn_idx, dd);
annDeallocPt(p);
annClose(); //ANN结束
其他关于ANN更详细的说明及用法详见ANN官方操作手册:
https://www.cs.umd.edu/~mount/ANN/Files/1.1.1/ANNmanual_1.1.1.pdf