这个头文件声明,实现了各种执行搜索算法,结果的存储,如有理解不到位的地方,请大家见谅。
结构体:
struct BranchStruct;
该结构主要用于对于KDTREE算法,执行查询时,结果的存储的基本单位。
成员变量:
T node;
DistanceType mindist;
node的类型,取决于KDTREE中结点的类型。
mindist的类型,取决于对距离类型(如L1,L2)。
成员函数:
bool operator<(const BranchStruct<T, Distrancetype> & rhs) const;
提供两个BranchStruct用于比较的函数,重载操作符<,比较两个实例mindist的大小。
结构体:
struct DistanceIndex;
该结构体,适用于除了TREE搜索以外的搜索算法。
成员变量:
DistanceType dist_;
size_t index_;
dist_存储具体的距离。
index_存储point的索引。
成员函数:
bool operator<(const DistanceIndex& dist_index) const;
重载操作符<,提供比较大小。大家重具体实现中可以得出,比如:
DistanceIndex a,b;
(a < b) == true;
当a.dist_ < b.dist_ 或者 a.dist == b.dist_ 但 a.index_ < b. index_ 时,a
class ResultSet;
虚类ResultSet,它声明了三个方法,为:
virtual bool full() const = 0;
virtual void addPoint(DistanceType dist, size_t index) = 0 ;
virtual DistanceType worstDist() const =0 ;
这里给大家,大致叙述下这三个方法的作用。
full()方法用来判断resultSet是不是满了,比如当我们用KNN搜索时,当resultSet中存储了K个结果是,KNN的resultSet就存储满了,下次我们还要添加结果时,就要删除和移动一些POINT。
addPoint方法,将一个point添加进ResultSet。
worstDist()返回,ResultSet中,离目标最远的距离。
class KNNSimpleResultSet;
该类继承于ResultSet,该类声明并定义了一个简单用于存储KNN查询结果的类,因为该类并不能判断,结果中两个point是同一个point,所以只适用于那些,不会存储同一POINT的算法。
成员变量:
size_t capacity;
size_t count_;
DistanceType worst_distance_;
std::vector<DistIndex> dist_index_;
capacity表明该KNNSimple集合的容量。
count_表明现存元素的数量。
worst_distance_ 为离查找点最远的距离。
dist_index_ 为动态数组(用于存储point),数组类型为之前提到的DistanceIndex。
方法:
void clear();
作用为初始worst_distance_,dist_index_ 和 count_.
worst_distance初始为最大的DsitanceType,dist_index_的最后一个元素的dist_初始为worst_distance_,count_初始为0。
注:在KNNSimpleResultSet初始化后,dist_index中所有元素的索引值为-1,dist_为最大值。
size_t size() const;
返回当前元素的数量,即count_。
bool full() const;
判断容器是否满了,即count_ == capacity_。
void addPoint(DistanceType dist, size_t index);
该函数的作用是将一个point添加入ResultSet,但这里要注意几个细节。
1。 该point的距离,即dist不能大于worst_distance_,否则无法添加。
2. 该point添加后,dist_index_ vector中的元素仍按升序排列。即dist_index_[0]对应的dist_最小,以后单调非严格上升(如果之前你定义了FLANN_FIRST_MATCH, 当比较大小时,若dist_相等,还需比较索引号的大小,索引号越大,越靠后)。
3. 插入后worst_distance_仍是最后一个point对应的距离。
void copy(size_t* indices, DistanceType* dists, size_t num_elements, bool sorted = true)
将dist_index_中元素的索引号,距离的大小,分别拷入以indices, dists为头指针的数据块中。拷入的大小为取num_elements与count_的较小值。是有序的升序。
class KNNResultSet;
该类与KNNSimpleResultSet相似,只是在addPoint时,加入了严格检测是否重复的判断逻辑。其余相同。
class KNNResultSet2;
该类的功能与KNNSimpleResultSet一样,只不过它用了heap数据结构,所以效率更高。
关于RadiusResultSet等,跟上面差不多,我就不写了,有兴趣的可以阅读源码就行。