最近邻居搜索——压缩存储

原创 2013年12月03日 16:38:09

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

轻松学算法2:邻居好说话——冒泡排序

算法2:邻居好说话——冒泡排序     简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请210000000...

重温OSPF——OSPF邻居建立

OSPF:OpenShortestPathFirst OSPF路由协议是由IETF组织开发,作为RIP路由协议的替代协议,解决RIP路由协议的固有问题。是IETF组织推荐使用的IGP协议。OSPF路...

homerHEVC代码阅读(29)——创建当前CTU的划分块的邻居信息create_partition_ctu_neighbours

create_partition_ctu_neighbours的作用是计算当前CTU中的每一个CU的邻居存在的标志。 // 计算CTU下所有CU的邻居存在的标志 void create_partit...

2.HCNP-R&S-IERN——理解OSPF邻居与邻接关系

为了交换链路状态信息以及路由信息,OSPF路由器之间首先要建立邻接关系。学习目标: 1. 理解OSPF邻居和邻接的概念 2. 理解OSPF中DR和BDR的概念 3. 理解DR和BDR的选举 O...

邻居好说话——冒泡排序

转载自啊哈: 算法2:邻居好说话——冒泡排序     简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2...

C++实验题——牧羊人和邻居

牧场主与猎户的故事,C++实验

存储过程把找到的记录的MenuOrder值与离他最近的一条进行交换附C#代码

这是效果图片C# Code:using System; using System.Collections.Generic; using System.Linq; using System.Web...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)