上一小节,我们对p稳定分布LSH的基本原理进行了介绍(http://blog.csdn.net/jasonding1354/article/details/38237353),在接下来的博文中,我将以E2LSH开源代码为基础,对E2LSH的源码进行注解学习,从而为掌握LSH的基本原理以及未来对相似性搜索的扩展学习打下基础。
1、代码概况
E2LSH的核心代码可以分为3部分:
- LocalitySensitiveHashing.cpp——主要包含基于LSH的RNN(R-near neighbor)数据结构。其主要功能是根据参数构建数据结构进行查询数据对象的功能;
- BucketHashing.cpp——主要包含对于哈希桶的普通哈希表。其主要功能是构建哈希表,添加哈希桶到表中和查询哈希桶;
- SelfTuning.cpp——包含计算RNN数据结构最佳参数的函数。
其他代码说明:
- Geometry.h——包含对数据点的定义(数据类型PPoint);
- NearNeighbors.cpp, NearNeighbors.h——包含E2LSH核心代码的函数接口;
- Random.cpp, Random.h——包含伪随机数产生器;
- BasicDefinitions.h——通用的类型定义和宏定义;
- Utils.cpp, Utils.h——包含一些通用的函数(如复制向量)。
2、主要的数据结构
(1)RNearNeighborStructureT(LocalitySensitiveHashing.h中定义)——R near neighbor数据结构。该结构包含构建数据结构的参数、哈希函数族gi的描述、结构中数据点的索引和用于存储哈希桶的L个哈希表的指针。
typedef struct _RNearNeighborStructT {
IntT dimension; // dimension of points.
IntT parameterK; // parameter K of the algorithm.
IntT parameterL; // parameter L of the algorithm.
RealT parameterW; // parameter W of the algorithm.
IntT parameterT; // parameter T of the algorithm.
RealT p