1. 问题定义
最近邻搜索就是在空间数据库中找出包含查询关键字且离查询点最近的k个数据点,其中k为常数。
2. 现有方法
2.1IR2-tree(Information Retrieval R-tree)
基本思想:
(1) 利用哈希将每个关键字映射为位串(bit string);
(2) 用R树将组织所有数据;
(3) 将位串信息嵌入到R树结点中作为关键字信息,叶子结点的关键字信息为该点的位串,非叶子结点中关键字信息为其所有孩子的关键字信息的与(&)。
如图2-1所示,关键字映射的位串如表2-1所示,建立的IR2-tree结构如图2-2所示。
图2-1 数据图
表2-1 关键字位串映射表
图2-2 IR2-tree
检索过程:
(1) 求出所有查询关键字的“与(&)”Qk;
(2) 从IR2-tree树根开始遍历关键字信息与包含Qk的所有结点且离查询点较近的结点(非叶子指到矩形的距离);
(3) 当该结点为叶子结点时需验证是否确实包含所有关键字,若包含则为结果;反之继续计算,直到找到k个结果。
2.2Inverted Index
基本思想:
(1) 建立关键字倒排表;
(2) 查找包含关键字的倒排,对链表求交集可得包含全部关键字的结点。
(3) 计算节点到查询点的距离,可得top-k。
例,如图2-3 a为数据图,图2-3 b为结点包含的关键字信息,其倒排表如图2-4所示。
图2-3
图 2-4 倒排表
3. 作者
现有方法分析:IR2-tree存在错误命中(false hit)的问题造成多次的无效访问;Inverted Index方法需要多次的I/O操作去得到位置信息。针对于此作者提出了SI-index(SpatialInverted list)结构并利用z-curve对倒排表进行了压缩存储。
作者的SI-index倒排中除了存储结点id外还保存了位置信息,如图3-1所示为图2-3 a的SI-index。检索方法与InvertedIndex类似,不再重复。
图 3-1 SI-index
压缩原理:如有一组有序数12 , 15 , 23 , 24 , 41 , 50 , 52 , 59,若直接存储需要log259 = 6个bit位。如果只存储第一个数,其它数只存与它前一个的差值,即存储序列:12 , 3 , 8 , 1 , 17 , 9 , 2 , 7,仅需要⌈log217⌉ = 5个bit位。
以二维空间作为例子叙述压缩存储空间全过程。对于图2-3中的结点p4 = (5, 4) = (010,100),令Z-value(p4) = 011000,注意到红色的部分来自x坐标,黑色的为纵坐标。类似可将每一个结点的坐标转化为一个数。随后将这些数排序,按照压缩原理进行压缩存储。给从新排序的结点以新的id,从而id也可以压缩且与坐标保持一致性。如图3-2为图2-3的压缩存储结果。
图 3-2 压缩存储结果
为了方便查询,进一步将压缩存储结果进行了分块存储,每一块开始均为真实值。
检索过程与Inverted Index类似,但需要解压缩。
4. 个人思考
采用压缩的方式“提升”了内存存储的信息量,或可将全部信息放入内存,只在必要时对相应的信息进行解压缩,但对于I/O操作还是具有绝对的优势。
作者的编码方式是基于z-curve的,按照z-curve组建的线性空间应该能保证在实际空间相近的点在线性空间也应该靠近。但作者给出的答案貌似不是特别相符,思考中……
论文:Fast Nearest NeighborSearch with Keywords