New data structures and algorithms for the efficient management of large spatial datasets

摘要
  在本论文中,我们研究多维网格的高效表示,提出新的紧凑数据结构来存储和查询不同应用程序域中的网格。我们为二进制网格和整数网格的表示提出几个静态和动态数据结构,并研究在地理信息系统,RDF数据库等中表示栅格数据的应用。
  我们首先提出一个静态数据结构的集合,用于二进制网格和整数网格的表示:1)具有大的均匀值簇的二维二进制网格的新表示,应用于二进制光栅数据的表示; 2)表示多维二进制网格的新数据结构; 3)新的数据结构以表示支持top-k范围查询的整数的网格。我们还提出了二进制网格的新动态表示,新的数据结构提供与我们的二进制网格的静态表示相同的功能,但也支持网格中的变化。
  我们的数据结构可用于多个应用程序域。 我们提出了通用方案的具体变体和组合,以表示时间图,RDF数据库,OLAP数据库,二进制或一般栅格数据和时间栅格数据。 我们还提出了一种新的算法来联合查询栅格数据集(使用我们的表示存储)和存储在经典数据结构中的矢量数据集,表明我们的方案可以比通常的替代方案更快,需要更少的空间。 我们的表示提供了有趣的权衡,并在空间和查询时间方面具有竞争力,通常在不同领域的表示。



目录
1简介
   1.1动机
   1.2 主要贡献
   1.3 论文结构
2基本概念
   2.1信息理论和数据压缩
     2.1.1信息理论的基本概念
      2.1.1.1上下文相关消息中的熵
     2.1.2数据压缩:基本概念
      2.1.2.1压缩技术的分类 
   2.2流行的压缩技术
     2.2.1运行长度编码
     2.2.2 Huffman 
     2.2.3 Lempel-Ziv家族
     2.2.4结束标记的稠密编码和(s,c)稠密编码
     2.2.4.1动态结束标记稠密编码
   2.3简单的数据结构
     2.3.1对位图进行排序和选择
     2.3.2任意序列的排序和选择
      2.3.2.1小波树
     2.3.3紧凑二进制关系
     2.3.4最大查询和top-k查询
       2.3.4.1最小范围查询
       2.3.4.2对序列和网格的Top-k查询
   2.4准确的动态数据结构   
     2.4.1动态位向量表示
     2.4.2动态序列表示
     2.4.3紧凑动态二进制关系
3前期工作
   3.1可直接寻址编码(DAC)
   3.2 K2树
     3.2.1数据结构和算法
     3.2.2改进
       3.2.2.1混合K2树:多个K值
       3.2.2.2 L:矩阵词汇的压缩
4本论文中研究的应用领域的前期工作
   4.1时序图
     4.1.1代表时态的替代方案和现有建议图表
       4.1.1.1基于紧凑数据结构的时态图的表示
   4.2 RDF图
     4.2.1 RDF图的表示
       4.2.1.1关系建议
       4.2.1.2具体解决方案
       4.2.1.3使用K2树表示RDF图
   4.3 GIS
     4.3.1地理信息系统和空间数据   
       4.3.1.1地理信息模型
     4.3.2栅格数据的表示    
     4.3.3压缩栅格数据的常用策略
       4.3.3.1文件格式
       4.3.3.2关系解决方案
     4.3.4二进制光栅图像的表示
       4.3.4.1四叉树
       4.3.4.2二进制图像的二叉树表示
     4.3.5一般栅格数据的表示
       4.3.5.1四叉树表示
       4.3.5.2基于Bintree的表示
     4.3.6时间演变区域数据的表示
       4.3.6.1基于四叉树的方案
     4.3.7矢量数据的表示
       4.3.7.1 R树

I新的静态数据结构

5 K2树对1的压缩
   5.1二进制图像的表示
   5.2我们的方案:K2树的压缩(K2-tree1)
     5.2.1使用三个代码对节点的颜色进行编码
       5.2.1.1朴素编码:K2-tree1
       5.2.1.2叶节点的有效编码:K2-tree1
       5.2.1.3重排序编码:可索引DF表达式
     5.2.2定制方法:K2-tree1
   5.3空间分析
     5.3.1与四叉树表示的比较
   5.4增强的K2-tree1
   5.5算法
     5.5.1窗口查询
     5.5.2设置查询
       5.5.2.1返回紧凑表示
     5.5.3其他操作 
   5.6实验评价
     5.6.1实验框架
     5.6.2我们的方案与原始K2树的比较
       5.6.2.1聚类二进制图像的压缩
       5.6.2.2查询时间
     5.6.3与线性四叉树的比较
   5.7编码的其他应用
   5.8总结
6 K2-树的多维表示关系
   6.1三元关系的表示作为二元关系的集合
     6.1.1 MK2-tree
     6.1.2 IK2树
     6.1.3 查询支持
   6.2 Kn-tree
     6.2.1数据结构和算法  
       6.2.1.1检查单元格的值
       6.2.1.2一般范围查询
     6.2.2 增强的Kn-tree
       6.2.2.1高维度问题的关注    
   6.3应用
     6.3.1使用K3树表示时序图
     6.3.2基于K2树的集合的表示
       6.3.2.1普通方法:图的多个快照
       6.3.2.2差异快照:diff-IK2-tree
     6.3.3实验评价
       6.3.3.1差异IK2树与“差异”K2树的集合的比较
       6.3.3.2与其他表示的比较
     6.4总结
7 K2-treap
   7.1概念描述
   7.2数据结构和算法
     7.2.1查询算法
       7.2.1.1基本索引:访问矩阵的单元格  
       7.2.1.2 Top-k查询
       7.2.1.3支持的其他查询
   7.3类似值的更好压缩  
   7.4实验和结果
     7.4.1实验框架
     7.4.2空间比较
     7.4.3查询时间
        7.4.3.1对合成数据集的Top-k查询      
        7.4.3.2对真实数据集的Top-k查询
     7.5总结

II新的动态数据结构
8 动态K2树:dK2-tree
   8.1数据结构和算法
     8.1.1查询支持
       8.1.1.1动态位图的访问和排序操作
       8.1.1.2 dK2-tree中的查询操作
     8.1.2更新操作
       8.1.2.1更改二进制矩阵的内容
       8.1.2.2邻接矩阵的行/列的变化
   8.2矩阵词汇
     8.2.1处理频率分布的变化
     8.2.1.1跟踪最佳词汇
   8.3改进对dK2树的访问
   8.4分析
   8.5实验评价
     8.5.1参数调节
     8.5.2矩阵词汇的影响
     8.5.3访问时间
     8.5.4更新时间
   8.6总结
9 dK2-tree的变体和应用
   9.1 RDF数据库的表示
     9.1.1我们的方案
       9.1.1.1查询支持
       9.1.1.2使用dK2-tree更新操作
     9.1.2实验评价
       9.1.2.1实验设置
       9.1.2.2空间结果
       9.1.2.3查询时间
   9.2使用dK2-tree的图像表示
     9.2.1压缩1的K2树变体的动态版本
     9.2.2算法
       9.2.2.1插入新的1
       9.2.2.2删除1
       9.2.2.3关于应用的注意事项
     9.2.3应用:二进制图像的表示
       9.2.3.1空间结果
       9.2.3.2时间结果
   9.3时序图的表示
     9.3.1 ttK2-tree:时间标记的dK2-tree
       9.3.1.1数据结构和算法
     9.3.2与静态表示法的比较
   9.4总结

III应用于GIS
10 K2树应用于一般光栅数据
   10.1我们的方案
     10.1.1独立K2树:MK2-tree1
     10.1.2累积K2树:AMK2-tree1
        10.1.2.1算法      
     10.1.3 K3-tree
     10.1.4压缩1的IK2树
   10.2方案比较
   10.3实验评价
     10.3.1实验框架
     10.3.2空间比较
     10.3.3查询时间
        10.3.3.1检索单个单元格的值
        10.3.3.2检索具有给定值的所有单元格
        10.3.3.3过滤值和空间窗口
   10.4栅格数据中的top-k范围查询
       10.4.1空间比较   
       10.4.2查询时间
   10.5总结

11用于时间演变区域数据的K2索引
   11.1我们的方案
   11.2实验评价
     11.2.1实验框架
     11.2.2空间结果
     11.2.3查询时间
   11.3总结
    
12光栅和向量表示之间的联接操作
   12.1向量查询和栅格数据
     12.1.1线性四叉树和R树之间的联接
   12.2我们的方案
   12.3常规栅格数据集和矢量数据集之间的联接
   12.4实验评价
     12.4.1实验设置
     12.4.2二值覆盖的实验结果
     12.4.3一般栅格数据的实验结果
       12.4.3.1空间结果
       12.4.3.2查询时间
   12.5总结

四  论文总结

13结论和未来工作
   13.1主要贡献
   13.2未来的工作







介绍

1.1 动机

信息的压缩表示作为计算机科学几乎每个领域的基本需要已经很长时间了。虽然存储空间的总量目前不是重要的问题,外部存储器(即磁盘)可以存储大量的数据并且非常便宜,但是访问数据所需的时间在许多应用中仍是重要的瓶颈。对外部存储器的访问传统上比对主存储器的访问慢得多,这导致搜索能够在减小的空间中存储相同信息的数据的新的压缩表示。

许多研究努力致力于创建紧凑的数据结构,用于表示几乎任何类型的信息:文本、排列、树、图等。压缩数据结构通常比传统方式执行效果好,由于存储在存储分层的上层结构中,利用了每层间的数据差异。紧凑的数据结构允许处理压缩的信息形式,支持直接从紧凑表示处理信息的算法,其将理想地完全存储在主存储器中。

在这论文中,我们关注多维数据的表示,特别是对以网格,图形或二进制关系的形式出现在多个域中的二维数据的表示。现有技术上存在不同的数据结构来有效地表示和查询这些类型的数据。小波树[GGV03]是一种表示每列包含单个元素网格的数据结构。另一种数据结构叫做K2-tree[Lad11],是一种能够表示普通二进制网格数据到紧密形式的数据结构,利用了网格中稀疏性和元素1的可聚类性。

论文的主要目标是发展空间性数据的新的有效的表示形式,特别是在二维或n维网格中。此外,我们还关注被表示为二进制数或整型数据的网格表示上的其他问题。我们旨在利用网格的不同特性来获得有效的表示,以便获得更好的压缩,在压缩形式基础上并且支持查询操作。

我们技术的主要应用点是地理信息系统中光栅数据的表示,光栅数据是一种相邻单元间拥有相似值属性的网格数据,该属性在空间数据中非常频繁,并且由该域中的典型表示利用。但是,通用数据结构比如K2-tree在空间性数据上没有采用这种规则。

1.2贡献

在本论文中,我们提出了一组数据结构,设计用于在不同领域的多维数据的紧凑表示。我们的许多建议是基于称为K2树[Lad11]的稀疏二进制矩阵的紧凑表示,其最初被设计为Web图表示。我们分别描述每个贡献,详细说明它解决的问题:

  1. 我们的第一个贡献是利用类似值的聚集对二进制矩阵或网格的紧凑表示的数据结构的设计,分析,实现和实验评价,利用类似值的聚集。我们的方案是基于K2树,并且能够有效地压缩具有大区域0和1的二进制网格。我们称之为概念性提案“K2-tree with compression of ones”或K2-tree1,并介绍该提案的几个变体和实现。所有这些都支持通过压缩表示访问矩阵的任何区域。我们将我们的方案与替代表示方案进行比较,以显示我们的变体实现与最先进的紧凑四叉树表示的空间竞争,并有效地支持多个查询操作,特别是有效访问网格的区域。一些新方案的初步版本已在第20届字符串处理和信息检索研讨会上发布(SPIRE2013)[dBAGB+13]。
  2. 我们的第二个贡献是设计和实现一个新的紧凑数据结构,用于表示多维二进制矩阵或n元关系。我们的方案,称为K n树,是将K2树中的概念泛化为更高维度的问题。我们将Kn树与最初被设计为表示RDF数据库[AGBF+14],使用K2树表示三元关系的类似替换即MK2树和IK2树进行比较。我们将我们的方案与这些替代方案进行比较,并研究每个方案的优势及其对不同问题的适用性。最终作为我们分析的概念的证明,我们将K 3树(对于3维问题的特定K n树)应用于时态图的表示。作为该实验的一部分,我们设计IK2树的变体,称为diff-IK2树,这本身也是贡献,因为当三元关系具有一些规则时,与IK2树相比节省了大量空间 ,提供有趣的空间/时间交易K n树数据结构及其对空间数据的首次应用发表在第20届字符串处理和信息检索研讨会上(SPIRE2013)[dBAGB+13]。用于时态图的IK 2树和我们的变体diff-I2树在数据压缩会议中公布(DCC)[AGBdBN14]。
  3. 我们的第三个贡献是设计和实现多维矩阵的紧凑表示,有效支持top-k查询。我们的新数据结构称为K 2 -treap,提供了一种有效的机制,可以在多维数据库中紧凑地存储信息,支持一般top-k查询或范围受限的top-k查询。我们实验评估我们的表示与基于先进的小波树表示,以及基于K 2树的更简单的表示相比,表明我们的数据结构在众多案例上能够超越最先进的方法。该贡献的初步版本已在第21届字符串处理和信息检索研讨会上公布(SPIRE 2014)[BdBKN14]。
  4. 我们的第四个贡献,在文中第二部分,是对动态二进制关系的紧凑表示设计,实现和实验评估了新的动态数据结构。我们的方案,dK 2树或动态K 2树是K 2树的动态版本,其支持由静态K 2树提供的所有查询算法,并且同时支持对二进制矩阵的更新操作,即改变现有单元格的值并添加/移除矩阵的行/列。我们通过实验评估我们的方案,表明它在静态表示上有一个小的空间开销。此外,我们实验地评估静态和动态K 2树中的不同查询算法,以显示由于动态实现的时间开销在许多真实世界查询中可能非常小。使用dK2树作为基础,我们设计了RDF图,时态图和栅格数据的新动态表示,我们通过实验评估所有这些动态表示,以显示动态表示所需的开销在大多数情况下是合理的。新的数据结构在数据压缩会议上以初步形式提出(DCC 2012)[BdBN12]。
5. 我们的第五个贡献是设计,实现和实验评估新的表示,以解决GIS中与栅格数据的存储和查询相关的不同问题。我们可以将这个贡献分为三个,因为我们研究了三个不同的问题:
   A. 我们使用基于先前贡献的方案来设计用于一般光栅数据(非二进制光栅图像)的紧凑表示的技术。从该研究创建两个新的数据结构,AMK2-tree1(特定用于该问题的MK 2树的变体)和IK 2 -tree1(合并了IK 2树和我们的第一贡献的K2-tree1)。我们还研究了我们其他方案的应用,包括K 3树。我们的所有表示都是紧凑的数据结构,支持压缩形式的高效导航,比现有技术的替代方案需要更少的空间,并能够在主存储器中有效地工作。
   B.我们使用与先前贡献中的类似方案来设计用于时间光栅数据(移动区域)的紧凑表示的技术。我们开发具体的算法来回答我们的提案中的时空性查询,我们在这个新的上下文中实验性地评估所有这些算法,显示它们非常紧凑,并且仍然能够有效地回答相关的查询。
   C.我们提出了新的算法来同时查询(连接查询)使用我们的紧凑数据结构存储的栅格数据集和使用R树存储的矢量数据集。我们研究二进制光栅中的问题(使用K2-tree1),显示我们的算法显著减少R树中所需的访问次数。我们还将我们的评估扩展到一般栅格(使用AMK 2 -tree1表示栅格数据),其中我们的实验评估显示我们的表示需要更少的空间,并且比基于栅格数据集的顺序遍历的更简单的算法更快。
用于表示一般光栅数据的一些建议的初步版本已经在第20届字符串处理和信息检索研讨会发布(SPIRE2013)[dBAGB+13]。


 





2.2  流行的压缩技术
   在这一节中,我们陈述了一些被广泛使用的压缩技术,无论是单独的或者合并其他的方法。这些压缩技术是常用在建筑块的许多紧凑的表示。这一章中所有的压缩技术是无损技术。
 
2.2.1  行程编码(游程编码)
  游程编码(RLE)是一个经典的和简单的压缩技术。一条信息用具有代表性的符号和字母编码表示为等符号的序列。如,给一条信息aaabbbbaaaccccbbbb,这条信息的游程编码为3a5b3a4c4b(3个a,5个b,3个a,等等)。
即使是一个非常简单的RLE编码,只需要利用重复相同的符号(也称运行),由于它的简单性被广泛应用于不同领域的压缩。尤其期望应用于1、0操作的二进制压缩数据,出于这个原因,游程编码被作为数据结构字段的位串的简单压缩技术,和通常与其他技术相结合用于在传真机中二进制图像压缩的的多标准中黑白图像的压缩。
 
2.2.2  哈夫曼
  经典的Huffman编码[Huf52]是一个著名的压缩原理,在文本压缩,图像压缩等方面有很多应用,这是一个统计的半静态压缩。哈夫曼编码的一个重要特征是,对于任何资源哈夫曼码是最有前缀码。在产生一组源符号的编码的过程中,考虑到频率的分布,构建二叉树。
在哈夫曼树中的每个节点,将有0个或者2个孩子,从叶子节点到根节点哈夫曼树的构建如下:首先,一个节点为一个源符号,并且源符号的频率为节点的权重。然后,选择较低的权重的两个节点,一个新的内部节点被添加到树中并将这些作为孩子。新节点的权重将是其子节点的总和权重。在下一次迭代中,已经合并的节点将不被考虑:想反,我们将考虑新创建的节点。合并两个权重和较小的节点,直到所有节点合并,哈夫曼树构建完成。一旦树被建立,分配给源符号(叶子节点)的编码是根据树的其路径给出的(左分支为0,右分支为1)。由于权重较小(出现频率较少)的首先被合并,他们属于较低层次的树,因此有较长的编码。

  
  图2.1显示了哈夫曼树表示一个字母表{a,b,c,d,e}。在第一步中,结合e和d节点。新的节点的权重为0.2,第二步,节点b和c有最小的权重,因此他们结合产生另一个内部节点权重是0.3,然后,两个新的内部节点合并,最终a和树的其余部分结合。最终的哈夫曼编码是a↔ 0,b↔100,c↔101等等。注意,当多个节点有相同的权重是,我们可以选择不同的构建哈夫曼树的方法,导致不同的编码。
哈夫曼编码信息必须包括除了编码序列,从源符号到创建的哈夫曼树的形状。利用这些信息,解码器可以从源符号解码编码:每次读一位,在哈夫曼树前进(向左一位为0,反之,向右一位为1)。当叶子节点到达,编码转换为联合到叶子节点的一组符号,并解码器回到哈夫曼树的根。
 
2.2.3  Lempel-Ziv压缩算法系列
  Lempel-Ziv压缩算法是最著名的和应用更多的基于字典的自适应的压缩算法。LZ77[LZ77]和LZ78[LZ78]是广泛应用的压缩算法的基础,如gzip3和p7zip4 。LZW[Wel84]是LZ78的演变被应用于Unix的压缩和GIF图像格式的压缩。这一系列的压缩算法并没有达到一个最佳的压缩值,然而有比较差的如编码算法自适应技术。他们主要优势是他们的压缩和解压速度,尤其在他们的快速解压速度是他们被广泛应用于的原因之一。
  虽然这一完整的压缩算法被广泛的应用,但我们只表述LZW,将在后面的章节中涉及到,LZ77和LZ78在基础上是相似的但是他们在建立字典和如何创建输出是不同。
  LZW是一种被广泛应用的LZ78的演变。它用一个字典包含源信息原先的编码的子串。首先,将字典初始化为包含源编码表中的所有符号。因为所有符号都是最初在字典中的,LZW的输出将完全由指针指向词典条目(即,它不需要输出符号)。压缩是从左到右执行读取源信息的。在每个压缩步骤中,LZW读取源信息时,在词汇表中有一个匹配的序列。当一个不匹配的符号被发现,LZW输出对应的最长匹配序列的字典条目,并添加到字典级联下一个符号序列的匹配结果。下一步处理步骤将开始非匹配符号。
3http://www.gzip.org
4http://www.7-zip.org
 
 
 
   表2.1显示了LZW的压缩步骤和对信息abababbbcabc的词典条目的演变。注意,字典初始化存储所有的符号在我们的源字母表Σ= {a,b,c}。在第一个处理步骤中,我们读取输入信息,直到找到一个不匹配的序列。由于我们的词汇只有符号,最长匹配的序列将是“a”,位于entry0的词汇,和不匹配的符号(下一符号)将因此我们产量的b,该序列的一个词汇表中的位置,和增加输入的词汇ab,导致链接entry0与下一个符号b, 下一个处理步骤将从在上一步读入,在第二位置的符号b。表2.1显示了信息的完整处理过程,重复的基本步骤,直到完整的消息已被处理。
   在LZW的一个关键因素是最大规模的字典和策略用于添加/替换的子字符串。一旦达到最大的字典大小,我们可以在多个备选方案之间进行选择:不允许新的条目和继续当前的压缩,使用最近最少使用(LRU)政策,确定哪些条目的字典可以删除添加新的,放弃当前的字典,建立一个新的(空的)字典,等等。
 
2.2.4  末端标记密度的编码和(s,c)密度编码
  End-Tagged Dense Code (ETDC) [BINP03, BFNP07]是一个半静态统计面向字节的编码/解码器。这是一个简单的编码方法,在保持和类似哈夫曼算法[SdMNZBY00]的压缩比的同时取得了很好的压缩和解压时间,面向字节的哈夫曼版本得到了最优的面向字节的前向编码。
  考虑到一个符号序列S=s1…sn 。在第一次通过ETDC计算每一个不同符号的频率,并创建一个词汇表将全部频率按照降序存储。ETDC分配给每一个输入的词汇一个可变长度的编码,这将是缩短第一项的词汇(多频率的符号)。然后,源序列中的每个符号被关联可变长度的编码代替。
   ETDC的核心思想是去标记每个编码的结尾(可变长编码):每个字节的第一位将是一个标志,如果当前字节是编码的最后一个字节设置为1否则为0。序列中剩余的7位使用不同的值分配,从而使编码分配在ETDC非常简单。考虑到词汇的符号,是由频率存储依次为:前128(27)符号将被分配的1位字节编码,1282个符号将被分配的2位字节编码等等。编码被分配依赖于符号的位置在排序的词汇:最频繁的符号将有代码10000000,下一个10000001,等等,直到11111111(即,使用的顺序号右边的7位字节,而第一个标志位来标记这个码字只包含一个单字节)。之后他们会2字节的编码,从00000000 10000000,00000000 10000001等(注意标志设置为0在第一个字节标示,编码继续)。表2.2显示了每个符号的完整的编码分配取决于它的位置。
 
  简单的编码分配是ETDC的快速压缩和解压时间的基础此外,其使用的所有7位可能的组合分配码字的能力使得它在空间非常有效。注意,ETDC可以用不同大小块去编码:一般情况下,我们使用任何大小为b,使用1位作为标志,剩下的b-1分配编码,因此有1块2b-1的编码,2块22(b-1)的编码等等。在然而,位数被用来作为基本块大小(b= 8),在大多数情况下,为效率。
  例2.2:考虑序列afadabaccaadaabbbbabae,并考虑用简单的块的大小为3位(如b=3)。用ETDC去表示序列我们使用符号的频率a(10) > b(6) > c(2) >d(2) > e(1) > f(1)(符号的顺序和频率相同不是重点)。最频繁的符号将分配顺序1块编码:a ↔ 100,b ↔ 101, c ↔ 110, d ↔ 111。最少的频率符号将分配2块编码:e ↔ 000100, f ↔ 000101。
 
  (s, c)-Dense Code.  ETDC中使用标志去标记编码尾部意味ETDC用128(2b-1)值(从0到127)去表示符号没有终点编码,称作为continuers(c),并其他128值(从128到255)表示一个尾编码,称作stoppers(s)。ETDC的一种加强(或者一般化)已经提出在stopers和continuers的数量,他们的值s+c=2b  。这个方法,称为(s,c)编码或者(s,c)-DC[BFNP07]被认为所有的字节用0和s的值,剩下的字节是c的值。编码分配和ETDC很相似:第一个字节给出1位的编码,字节的位置从s到sc-1给出2位编码等。
 
2.2.4.1  动态ETDC
   动态尾标签编码(DETDC[BFNP05])是一种自适应ETDC版本也是一般化的动态(s,c)-DC。
作为一种自适应的机制,压缩前它不需要进行预处理和排序的所有的符号序列。相反,它保持符号的词汇,根据压缩的收到的新的信号修改。
   DETDC的解决方案对于保持一个自适应的词汇表总是按频率的。这意味着,新的符号总是附加在词汇的结尾(与频率1),现有的符号在压缩过程中的频率变化时,可能会改变他们的词汇表中的位置。
  对消息进行编码的过程开始依次读取信息,每个符号读入在词汇表中被查找,并根据是否被发现:
  如果在词汇表中没找到符号,它是一个新的符号,因此它被附加在词汇的末尾用频率1.编码器编写新的编码,其次是符号本身的编码。解码器确定一个新的符号,因为其编码大于解码的词汇大小,并添加新的符号在自身的词汇上。
  如果在词汇表中发现符号,编码器只是写它的编码作为输出。在写入输出后,编码器更新符号的频率(增加1)和重新排序新的词汇表。由于符号的频率从f改成f+1,它移动区域把频率f+1存储到词汇表。重排序的过程是交换词汇表中元素。DETDC的关键是,编码器和解码器共用一个词汇表模型和更新他们的词汇的方式,因此在压缩过程中改变词汇表可以自动通过解码器的相同的算法并不用发送附加信息。
  ETDC存储的哈希表包含了所有词汇表中的符号。对于每一个符号,它的值、当前的频率和词汇中的位置都存储在节点的哈希表中。此外,数组posInH包含词汇表中每一个符号一个条目,存储排列好频率。在posInH中的每个条目指向了哈希表中包含符号的条目。最后,另一个数组top的使用:top[i]包含第一个符号在词汇表的位置并用频率i表示。
  用n表示当前词汇表的大小(最初n=0)。给一个符号编码,首先看在H中查看符号。如果它不存在,那它被插入到H并频率为f=1,posInH[n]更新指向新的条目并且n加1。如果符号已经存储在H中,用f表示之前的频率和p表示它的位置:编码器首先编码符号然后在H把它的频率加1,最后位置p和top[f]的位置交换(也就是说,我们用频率f交换词汇表中第一个元素的当前符号),并且top[f]的值加1。在这种方式下,新的最高的值仍然指向用频率f表示的第一个元素,被编码的符号现在在频率f+1的区域(它实际上是在该区域的最后一个符号)。
  DETDC和它的演变可以在压缩自然语言文本上达到一个非常好的结果,压缩结果可以与原本的ETDC未用半静态方法得到结果很接近。



2.3 简洁的数据结构

  简洁的数据结构目的是在接近信息理论的下限空间中进行数据表示,同时能够有效的解决所需要的数据操作。通过简洁的数据结构实现空间的减少,这种结构允许在层级存储器中更快的工作。虽然访问简洁数据结构的算法通常更复杂,但是减少的空间提供更有效的访问时间,甚至超过了简单压缩和未压缩表示的效果。大量的工作致力于得到更简洁的树的表示结构[Jac89,MR97,FM11],文本[GGV03,FM05],字符串[GGV03,GMR06,HM10],图形[Jac89,MR97,FM08]等。

2.3.1位图的排序和选择
  第一个简洁的数据结构由位向量组成(通常称为位图,位串等),支持排序和选择操作。这些基本的操作构成了其它简洁数据结构的基础。
  定义B [1,n]是大小为n的二进制序列。 然后定义排序和选择为:
  如果从B的开始位置到位置p(位)b出现的总次数为i,则rankb(B,p)=i;
  如果序列B中的(位)b的第i次出现在位置p处,则selectb(B,i)=p;
  由于这两种操作在其它简洁数据结构显示出来的重要性(比如全文索引[NM07]),许多策略被开发出来,从而有效的实现排序和选择。 
  Jacobson 在[Jac89]中提出了一个实现方法,该方法能够在常数时间内计算排序。它基于两级目录结构。对于每p个s=[log n][log n/2]第一级目录存储rankb(B,P),对于每p个b=[log n/2]第二级目录存储来自多个s的相对排序的值。按照这种方法,在这两个目录中添加值,可以在常数时间内计算出rank1(B,p):第一级目录返回直到前一个s的倍数处排序的值。第二级目录返回直到前一个b的倍数处1的个数。最后在位向量上顺序的计算从前一个b的倍数处到位置p的1的数量。这种计算通过使用一个欲计算表可以在常数时间内实现,计算表中存储块大小为b的所有可能的排序的值。因此可以在常数时间内计算排序。选择操作可以通过二进制搜索在时间O(log log n)内完成.通过仔细选择s和b的大小,使得辅助字典结构所需的总空间大小为O(N):第一级目录O(n/log n),第二级目录O(n log log n / log n)和查找表O(log n log log n)。Clark [Cla96]和Munro [Mun96]的工作通过使用附加的O(n)空间获得了选择操作的常数时间复杂度。例如,Clark提出了一个新的三级目录结构来完成select1,并且可以通过复制完成select0。
  在理论上通过附加O(n)bit空间在向量,先前的方案至少解决了位向量支持增加秩和选择的操作问题。然而,接下来的工作是致力于得到更有效的额压缩表示,并且考虑二进制序列的实际性质[Pag99,RRR02,OS07]。Pagh [Pag99]将二进制序列拆分成若干相同大小的压缩块,每个块由其存储的1
的位的数量来表示,并且该数目对应于特定的子序列。
  Raman等人 [RRR02]使用大小为u=logn2的块的集合来表示压缩二进制序列。每个块被编码为一对(ci,oi),其中ci表示其包含的1的数目(块的类),oi表示在具有ci 1s块的排序列表内该块的偏移。以这种方式,具有较少(或许多)1的块需要较短的标识符,并且这种表示实现二进制序列的零阶熵。这种方法在核定时间内对0和1的位进行排序和选择,但是比先前的表示方法更加复杂。
  Okanohara和Sadakane [OS07]提出了几种实用的替代方案。每一个变体中具有不同的优点和缺点,并且可以应用于不同的情况。它基于对连续1位之间的距离进行编码。已经提出了遵循该方法的几种拓展[Sad03,GGV04,BB04,GHSV06,MN07]。
2.3.2任意序列的排序和选择
  排序和选择操作已经扩展到了符号序列。给定从字母表中选择的字符序列S=s1s2...sn,对该序列的rank和select可以描述为:
  ranks(S,p)是序列S中到位置p处符号s出现的次数。
   selects(S,i)是序列S中符号s第i次出现的位置。
  对于位图中提出的采样解决方案在这里很难应用,因此在一般字母表序列上提供的典型排序和选择方案是减少在位图上排序和选择的问题。一个简便的解决方案是为每个序列s建立一个位向量,从而能够在常数时间内解决ranks(S,p)和selects(S,i)。然而这种方案对于一般的序列并不适用,因为它需要n*|Δ|位,远大于序列的大小。
  
2.3.2.1小波树
小波树[GGV03]是一种允许我们计算任意符号序列排序和选择的数据结构。小波树仅仅是一个平衡二叉树,它为每个节点v存储一个比特向量Bv。树的根包含长度为n的位图Broot,这里n是序列的长度。如果序列中位置i处的符号属于字母表的前半部分,则Broot[i]将被设置为0,否则设置为1。现在跟的左孩子节点将处理字母表的前半部分的符号,右孩子节点将包含其他的。在两个孩子节点中地递归的应用相同的处理过程,在每个步骤中将字母减半。直到字母表不能再分的时候分解结束。图2.2显示了一个示例序列的小波树表示(注意,只有节点N1,N2和N3所示的位图将被实际存储,每个节点处的符号序列表示出来仅是为了更好地理解分解过程)。
             图2.2:序列abcbcaacda的小波树
在小波树中,对原始序列的排序和选择操作在树的自顶向下或自底向上遍历中被有效地完成。假设我们想在图2.2的小波树中查找序列中直到位置8符号b出现的次数(rankb(S,8))。我们知道b属于词汇表的前半部分,因此在N1的位图中应为0。我们计算rank0(BN1,8)= 5,它给出了直到位置8处字母表左半部分的元素数。因此,由于N1的左孩子只包含左半部分的符号,我们移动到N2时的新位置将是5。在N2中,我们重复二进制排序运算。在该情况下,b在节点词汇表的右半部分,因此我们执行rank1(BN2,5)=2。由于N2是叶节点,我们立即返回结果2。如果我们要计算selectc(S,2),我们执行反操作,对树自下而上遍历。从字母表中的c位置,我们可以知道它在小波树的叶中的位置。在该情况下,符号在节点N3中使用0来表示。我们计算select0(BN3,2)=2,这给出了我们需要在上层检查的位置。当我们移动到N1,我们知道我们来自它的右孩子节点,所以我们需要计算的操作是select1(BN1,2)= 5。由于我们已经到达根节点,我们已经获得了序列S中第二个c的位置。
  小波树的许多变体被提出来以获得更好的空间效果。小波树可以实现序列的零阶熵通过放弃平衡二叉树,而使用序列的霍夫曼树的形状,或者使用Raman等人的压缩位图的表示。在每个节点中[GGV03,NM07]。 基于小波树的其他表示也已经被拓展以减少树的空间需求或改进查询[CNO15]。小波树也被推广到使用一个arity p的树,其中每个节点包含大小为a的词汇表上的序列,而不是通常在其节点中具有比特向量的二叉树。这个变体通常称为广义小波树或多元小波树,减少树的高度以及查询时间,在每个节点序列中支持基于常数时间的排序和选择。

2.3.3紧凑二进制关系

  即使在静态上下文中,直到最近几年一般二进制关系的紧凑表示都没有受到学者的关注。然而,二元关系的具体应用已经被广泛研究。尤其是提出了几种使用小波树表示二进制关系的方法,充分利用该数据结构的灵活性和理论 。
  用于一般二进制关系的紧凑表示的研究最多的方法之一是将问题降至序列的表示问题。考虑一组包含t对数据共n个对象、a个标签之间的二元关系R。我们将二进制关系表示为大小为a×n的二进制矩阵M,其列是n个对象,行是a个标签。在此矩阵中,只有在对象与相应标签相关时单元格值为1。因此,M中的1的数量将等于t,也等于R中的数据对数。矩阵可以使用长度为n+t的位图B和长度为t的字符串S在字母表a上表示。位图B将矩阵的每行中的元素的数目进行一元存储。图2.3显示了这种转换的一个例子。Barbay等人[BGMR07]首先展示了如何解决对以这种方式表示的二元关系的对象和标签的排排序和选择操作,其中假定S和B支持排序和选择操作。因此,他们的解决方案提供了对二进制关系的相关操作集合的支持,这种二元关系依赖于现有的现有的位向量和序列的实现。

 图2.3:简化的二进制关系到字符串

  将二进制关系上的基本操作降为对S和B的操作是非常简单的。例如,为了在图2.3的示例中检索与对象5相关的所有标签,我们只需要访问S[select1(B,5),select1(B,6)-1]。如果仅检索与对象5相关的第二个标签,我们将直接访问从select1(B,5)计数的第二个元素。为了找到直到位置7标签c的出现次数,我们可以简单地计算在第7列之前S中该符号的出现次数:rankc(S,select1(B,7)-1)。还可以使用由小波树支持的特定算法来执行涉及对象和标签的范围的更复杂的操作。

2.3.4最大和top-k查询

2.3.4.1最小范围查询
给定一个序列的值S[1,n],范围最小(最大)查询(RMQ)请求S的子序列[si,se]中的最小(最大)值。由于它在更复杂的查询中具有多个应用,有效地定位任意子序列的最小值/最大值的问题得到了广泛的研究。几个数据结构被提出以使用尽可能少的附加空间在常数时间内计算范围最小值/最大值。目前,范围最小(最大)查询的最佳解决方案能够仅使用2n + o(n)位在常数时间完成查询[Fis10]。该表示基于n个节点的简明树,其查询以针对在常数时间中的任何范围定位最小值的位置。这种结构和其他RMQ数据结构的一个重要事实是都指向最小值的位置,因此如果我们对最大值感兴趣的话则它们必须与序列一起存储。然而,如果我们只对最大值的位置感兴趣,我们可以丢弃序列并仅存储RMQ数据结构。

2.3.4.2对序列和网格的Top-k查询
  Top-k查询通常涉及从集合中定位最相关的项目。给定任何估计项目的相关性的可比值,top-k查询要求在集合中具有较高相关性值的k个项目或k个最大值。给定任何可比值用来评价其中的相关性,一个top-k查询要求在集合中具有较高相关性值的k个项目或k个最大值。
  在值序列中,可以使用该序列上的RMQ数据结构来容易地完成top-k查询。逐个输出元素过程,如下所示:首先,使用RMQ数据结构找到范围中的最大值,并将其添加到优先级队列中,以及最大间隔值。然后,迭代地从优先级队列中提取元素。每当从优先级队列中提取一个元素时,它就作为一个新的结果发出,它的相关范围被划分为两个子范围到它的左边和右边,计算每个子序列的顶部元素并将它们添加到优先级队列。该过程在k次迭代后或优先级队列为空时完成。
  现在考虑一个[m×m]网格,其中每列可以包含单个1。此网格可以使用完全类似于序列的小波树来表示,但在此网格中,我们想完成二维top-k查询。top-k问题被简化为在小波树的叶中定位出现最大值的位置。假设我们向小波树的所有节点添加RMQ数据结构,这将允许我们在每个节点中定位相应子序列的最大值出现的位置。这能够对小波树的任意范围完成2维top-k查询[NNR13]。首先,我们定位所有与查询范围R = [x1,x2]×[y1,y2]相交的小波树的节点,以及落在该范围内的那些节点中的相应间隔。从具有间隔[x1,x2]的小波树的根开始,递归地添加每个测试节点的子节点,跟踪与[x1,x2]相交的每个节点中的相应间隔,直到该间隔变为空停止。只有当到达的小波树的每个叶与区间[y1,y2]相交时才被考虑。一旦找到这个节点集合,完成top-k查询的过程很简单:找到每个节点中的顶部元素,并且选择所有节点中的最大值作为第一个结果。为了完成该计算,每个节点的顶部元素被添加到优先级队列,然后提取最大值。每次从优先级队列中提取一个元素时,其间隔被划分为左侧和右侧的两个子间隔,并且这些子间隔中的每一个的顶部元素被添加到优先级队列。对于每个结果,它的x和y坐标总是可以在O(logm)时间内通过向上或向下遍历小波树找到。可以证明,与一个范围相交的小波树节点的数量将是O(logm),因此小波树能够在O((k + logm)(log km))时间中回答top-k查询。













4.2.1  表示RDF图

RDF只是一个概念性的框架不受任何物理方面的表示的数据。RDF的流行导致出现存储RDF信息的许多不同方法,被称为RDF存储。他们主要分为两大类:基于关系数据库和基于特定的数据结构设计去适应RDF的特征。

 

4.2.1.1基于关系数据库的方法

 

 

 

4.2.1.2基于特定设计方案方法

 

 

4.2.1.3用k2-tree表示RDF图

一种新的解决方案,提出基于k2-tree的压缩结构表示RDF数据[ÁGBFMP11, ÁGBF+14],这一方法被称为k2-triples,基于三元组的垂直分区,并利用k2-tree的优势作为基础有效的查询。

第一步是对RDF数据字典编码在k2-triples。在这一步,三元组(S,P,O),三元组的组件URIs被转化为ids。每一个URI被词典中对应的id代替,因此三元组实质上是用(vs,vp,vo)的形式表示,每一个v都是整数。他们用4组不同的URIs,可以独立编码,分别是同时包括主语和宾语,只有主语,只有宾语和只有谓语。

在字典编码应用后,把应用垂直分区应用到三元组中,对于不同的谓词,用一个k2-tree去存储所有对应的谓词。从概念上讲,每个k2-tree表示一个行是RDF数据中所有的主语的二进制矩阵,列是所有的宾语,一个格的矩阵对应一对(S,O)对应三元组(S,pi,O)当前的谓词。所有的矩阵不同的谓词在下面的顺序中包含相同的行和列:第一行/列对应有相同主语和宾语;然后,下一行对应主语是词汇表中唯一的,下一列对应宾语是词汇表中唯一的。

三元组模式可以在k2-triples中得到有效的应答。每一种可能的三元组模式转化为行/列/范围操作在一个或者所有的k2-trees在数据集中。例如,一个模式(S,P1,?O)可以转化为一个行查询在存储了三元组的谓词的k2-tree;一个模式(S,?P,?O)要求计算相同行的查询在k2-tree中;一个模式(?S,P1,?O)只是与谓词P1相关的在k2-tree中所有格子。

关联操作也可以在k2-triples被解决。作者提出了不同的方法解决两个三元组的不同的关联操作。

独立评估只是独立的计算两个模式然后合并结果:例如,响应一个(?S, P1, O1) ⋈ (?S, P2, O2)模式的查询,这个方法是计算(?S, P1, O1)的结果和计算(?S, P2, O2)的结果,然后查看第一个和第二个查询的序列的交集。

连评估,先计算最“简单的”的模式,然后运行受限于前一个模式的结果的第二个模式。下面根据前面的例子,响应(?S, P1, O1) ⋈ (?S, P2, O2)的查询用链评估我们先计算(?S, P1, O1)的结果然后运行一组简单的查询在(Si, P2, O2)每一个Si可以得到第一个查询。

第三个方法,交互式评估,在两个模式同步遍历k2-tree,过滤的结果依赖于每一边的关联值。在响应一个模式(?S, P1, O1) ⋈ (?S, P2, O2)的查询,我们同时执行(?S, P1, O1)和(?S, P2, O2)的查询。如果我们其中一个k2-tree对应的主语的范围为0,我们知道这个范围内的关联操作和结果不能产生,因此我们停止遍历第二树。在每一个k2-tree中的相同部分这些分支遍历操作是不必要的(如之前的例子,在第一个k2-tree查询列O1和第二个树查询列O2)。此外,即使每一个k2-tree查询操作不同。考虑到例子(S1, P1, ?V ) ⋈ (?V, P2, ?O2)的关联:在第一个k2-tree中我们查询对应s1行的所有元素,并在第二个遍历整个矩阵。如果在第一个k2-tree中V的值的范围内找到0,我们可以停止在第二个k2-tree中遍历所有与?V相交的区域。这种关联的操作要求一些计算去保持左边的节点数的关联与右边的节点“彼此抵消”。

在k2-triples中所有的每个谓词,三元组模式或关联操作都一定会查询到遍历谓词,如果谓词的数量很大代价将会很大。

增强版的k2-triples叫k2-triples+,提出相关变量的加速操作[ÁGBF+14]。作者提出了创建额外的索引表示,在数据集每一个主语和宾语,谓词把主语和宾语连接起来。这允许用变量关联对应的主语(s)和宾语(s)的谓词限制执行查询。作者创建两个压缩索引SP和OP用来返回谓词的列表给出相关的主语和宾语。在实践中,为了达到好的压缩,他们并没有直接存储列表,相反,用直接寻址编码有统计地编码列表和存储所产生的可变长度编码的序列提供可直接访问。

K2-triples在相关的三元组查询和简单的关联操作[ÁGBF+14]已经被证明与其他一流水准的RDF存储相比非常具有竞争力,[ÁGBF+14]建立了SPARQL的一块。然而,k2-tree的静态属性对于k2-triples是一个缺陷,因为RDF数据有一个动态的属性。改进的k2-triples+可以提高拥有大量谓词的数据集的谓词查询的时间,空间成本的增加和引入新的静态索引是不适合动态环境的。

RDF数据集可以建立快照数据,因此存储在静态的形式。然而,在许多情况下,新的信息是不断出现,必须纳入数据集,以保持其更新。如果我们使用一个静态表示的数据集的完整的数据集必须重建时,更新的信息出现,即使他们可能包括一个小片段比较完整的数据集。

 

这一表示是用k2-tree集合表示RDF对应的每一个三元组的谓词,这种表示提供了一个在一流标准的空间和查询非常具有竞争力的可代替的方法,但是静态文本受限于k2-tree静态的属性。

 

这一节我们提供一个基于dk2-tree的动态表示RDF数据的表示方法,只是用k2-tree代替dk2-tree表示每一个谓词。本节的目标是证明基于dk2-tree的表示可以达到静态k2-triples

的查询时间。此外,dk2—tree表示方法提供一个在RDF数据上的基本的更新操作。

 

















第6章 K2-树表示多维关系

  已经针对大多数现有表示研究了空间数据结构扩展到高维度的问题。如我们在第4.3节中所示,设计许多空间表示用来处理多维数据,最初设计空间表示用于二维空间,后来扩展到多维数据的管理。k-d树[Ben75]和R树[Gut84]是用于表示n维数据的数据结构的一般示例。另一方面,四叉树及其变体已经被提出用于2维数据,但是它们可以扩展到n维问题:八叉树是四叉树到三维数据的直接泛化,并且相同的名称用于表示n维数据的一般扩展。
   在本章中,我们提出一个新的数据结构表示n维二进制矩阵。我们的方案是对K2树的扩展,在3.2节进行描述,用于表示n元关系。我们称之为Kn-树。Kn-tree基于一般化分割算法的,其保持K2-树的简单导航操作并且提供n元关系的完全索引表示。我们的表示高效地支持涉及所有维度的约束查询,包括一个固定值或值的范围的查询。我们还引入了另一个数据结构-IK2树,最初提出用于RDF图的紧凑表示。在本论文中,我们将提出IK2树的新应用程序在特定域中数据的表示。在本章中,我们将展示如何使用Kn-tree和IK2-tree作为时态图的紧凑表示,并证明两个数据结构的适用性概念和它们之间的差异。

  IK2树最初被设计用来改进第4.2节中解释的经典K2树的RDF数据库的表示。IK2树数据结构以及一些变体与SandraÁlvarez-García[ÁGBdBN14]联合工作的结果的对RDF数据库和时态图的应用,对RDF数据集中数据结构及其应用的广泛描述是Álvarez-García博士论文的一部分[ÁG14]。

6.1三元关系的表示作为二元关系的集合

  存储三元关系的简单方法是将问题简化到二元关系的集合。给定三元关系R属于X×Y×Z,我们可以将其变换为|Y|集合的二元关系Ry,每个不同的值y对应一个Y。根据这种方法,每个(x,y,z)属于R在Ry中变为一对(x,z)。我们表示维度Y为分割维度或分区变量。在多个二元关系中的三元关系的分解简化了存储原始数据的问题,现在可以使用用于二元关系的任何表示来有效地存储原始数据。
6.1.1 MK2-tree
  已经研究了将三元关系分割成二元关系的集合的这种方法来利用K2树的功能。这已被应用于使用K2树表示RDF图(回想第4.2节),将RDF图视为未标记图的集合,并使用K2树表示它们中的每一个。我们称这种简单的方法为基于多个K2-树或MK2-树。
  一个三元关系R属于X×Y×Z的MK2树,其中Y是分区维度,简单地定义为K2树数据结构Ky的集合,每一个表示诱导二元关系Ry。每个Ky建立在其对应的二元关系的邻接矩阵上,对于所有位置(x,z)将包含1,使得(x,y,z)属于R.
  利用多个K2树来表示三元关系提供了一种有效地完成在分割维度(固定值分割维度查询)中限制为单个值的查询的方法,例如查找所有对(x,z)用于固定的y = 3):这些查询通过访问单个K2树完成。
  在多个二元关系中的三元关系的分解描述红引起的MK2树的主要缺点是减少分区维度中的索引能力降低。当我们的查询在分区维度(无界分区维度查询)中不受限制时,我们必须查询多个K2树以获得最终结果。例如,为了找到所有与y属于[1,10]的值,我们必须独立访问对应于[1,10]中的值的所有Kys,以获得最终结果。当分区维度较大时,这会导致这些查询的效率显着降低。

6.1.2 IK2树
  IK2树[ÁGBdBN14]最初被设计为MK2树的改进,特别针对于解决RDF数据库的表示的问题。给定三元关系到|Y|的分解相邻矩阵,IK2树同时表示所有那些矩阵,在单个数据结构中“合并”MK2树中使用的多个K2树。IK2树使用可变数量的位代替使用单个位来知道矩阵是否为空。
  图6.1显示了IK2树结构的一个例子,其中分区变量Y可以取三个不同的值。图的顶部示出了表示不同Ry的三个邻接矩阵,其中黑色单元对应于有效关系。在每个矩阵下方,我们显示了矩阵的概念性K2树表示,在图的底部是完整集合的IK2树表示。IK2树表示是将多个K2树重组成单个数据结构,创建合并所有这些树中的等效分支。图6.1显示了这个过程,以不同的颜色突出显示每个K2树的位。在K2-树下面示出的IK2-树表示包含不同K2-树中的所有分支,但是每个节点存储与包含该分支的所有K2-树中的等效节点相对应的所有比特。例如,标记为N0的节点包含对应于3个K2树的3个比特,但是节点N2仅包含2个比特,因为只有第二和第三K2树包含该分支。
  像单个K2树一样,IK2树存储在两个位图T和L中,这两个位图是在树的层次遍历中构建的。 图6.1底部所示的IK2树的位图表示包含IK2树的所有位。如我们所看到的,最终的位图表示包含每个矩阵的不同K2-树的位,但是它们在位图中交织,使得相同节点的所有K2-树的位一起存储在IK2-树中 。位图T和L是用于存储树的实际数据结构。
  IK2树表示具有从其构造导出的一些性质:
  IK2树使用与基于多个K2树的等效表示相同的位数:如图6.1所示,IK2树可以构建为重新排列单个K2树的位。
  即使不同分支中的节点可能具有不同数量的比特,属于一组K2的兄弟节点总是具有相同数量的比特。这是因为所有的K2树节点都有0或K2个子节点。另一个对于导航重要的属性是级别中的每个1在下一级中生成K2个比特(即使K2比特现在不是连续的,但是与来自其他K2树的比特交织),并且级别中的0 不会在下一级产生任何位。在第一级分解中,所有K2节点包含m位,其中m = |Y|。此外,只有至少包含1的节点具有子节点,并且节点中的1的数目确定其每个K2子节点中的比特数。这些属性允许我们对位图表示执行基本导航:
  在第一级分解中,我们有K2个节点,每个节点有m位。为了确定节点是否有子节点,我们需要检查它的m个比特中是否至少有一个。
  给定包含从T中的偏移p开始的b个位的节点(即,节点覆盖位置[p,p + b-1]),其子节点将从位置(rank1(T,p-1)+ m)× K2,其中m(矩阵的数量)是校正因子。每个子将具有o个位,其中o = rank1(T,p + b-1)-rank1(T,p-1)是当前节点的位中的1的数目。
       图6.1:使用MK2-tree和IK2-tree表示三元关系

这些属性提供了导航概念IK2树的基础。 接下来,我们将演示如何使用基本导航操作回答查询。

6.1.3查询支持
















6.2 The K^d-tree
  Kn-tree是第3.2节中解释的更高维度问题的K2树的泛化。Kn树的目标是使用在K2树中使用的分割策略和物理表示来表示二进制n维矩阵,同时提供对所有维度中的关系和支持约束的有效访问。
 考虑一个n维矩阵。 在不失一般性的情况下,我们可以假设其所有维度具有相同的大小s,并且s是K的幂。如果矩阵不满足这些条件,我们可以“虚拟地”扩展它,考虑到所有维度被放大到大小s0 = 2[logs],其中s是最大维度的大小,并且考虑到所有添加的空间填充0.矩阵被细分为Kn个相等大小的子矩阵,如下:对于每个维度,K-1个超平面在该维度上的位置i(s/K),i属于[1,K-1]处划分矩阵。在所有维度被划分之后,Kn子矩阵由超平面诱导,每个超级平面具有大小s / K×s / K。子矩阵可以使用它们在每个维度中的相对排序来编号。在一般情况下,我们可以选择以行主要顺序(按第一个维度开始排序)或列主要顺序(按最后一个维度开始排序)划分子矩阵。如果我们考虑(v1,v2,...,vn)每个维度中的子矩阵的相对位置,并且我们从第一维开始排序,共享相同v1的子矩阵将被连续地放置,而子矩阵共享vn 将被放置在每个Kn-1位置。如果我们开始按最后维度排序,则共享相同vn的子矩阵是连续的,而共享相同v1的子矩阵被Kn-1位置隔开。正如我们将在后面看到的,用于对子矩阵排序的方法在算法中具有很小的影响,因此在实践中,Kn子矩阵的排序的任何选择将由Kn树简单地调整基本操作来支持。
例6.2:考虑一个尺寸为s×s×s的三维矩阵,如图6.2所示。 请注意确定尺寸x,y,z的轴的位置。为了分割矩阵,我们用i = 1..K-1的平面x = i(s / K),y = i(s / K),z = i(s / K)。K3子矩阵由这些平面,位置(1,1,1)到(K,K,K)引起。对于子矩阵的排序,我们选择从左到右,从上到下,矩阵的前到后遍历,因此首先由z,然后由y(行),最后由x 柱)。对于通常情况K = 2的子矩阵的实际编号在图6的右边部分中示出。注意,在该示例中,我们选择排序以使得遍历容易在视觉上理解,但是在一般情况下, 尺寸可以
任意。
     
      图6.2:矩阵的K3树分区:一般情况(任意K)和K = 2的典型分区。
 
  根据与K2树中使用的递归过程相同的二进制矩阵构建Kn-tree。创建一个概念树,其根对应于完整矩阵。然后,如所解释的那样对矩阵进行细分,并且每个子矩阵将变为根的子节点。如果相应的子矩阵至少包含1,则该节点将被标记为1,否则为0。对于用1标记的所有节点,递归地重复分解过程,直至到达矩阵的单元。
示例6.3:图6.3显示了小三维矩阵和K = 2的K3树表示的示例。尺寸为8×8的原始矩阵显示在左侧。矩阵表示为空立方体,其中具有值1的单元格以黑色突出显示。概念树的根节点(右)具有8个子节点,对应于图6.2中解释的顺序的分区的8个子矩阵。只有第二个子矩阵至少有一个1,所以分解只在该节点继续。递归进行分解,如矩阵所示,直到达到单个单元。树的最后一级对应于包含至少1的所有2×2×2子矩阵。

           图6.3:三维矩阵及其K3树表示。

6.2.1数据结构和算法

  使用与K2树中使用的相同位图来存储概念Kn树:位图T存储除了最后一个层之外的所有层中的位,并且位图L存储最后一个层的值。K2树的基本导航属性也有小的修改:每个内部节点将具有正好Kn个孩子,所以在T中位置p处的节点的孩子将位于p'=rank1(T,p)×K^n。
示例6.4:图6.3中所示的K3树的位图为:
T: 01000000 10010001
L: 11010000 00110000 00010101 

  在位置1(我们开始编号为0)中的节点的子节点开始于位置p'=rank1(T,1)×K^3=1×8=8。位置8处的节点的孩子从位置p"=rank1(T,8)×K^3=16开始。当P">=|T|时,它们实际上位于L [p"-|T|]中。
  考虑不同的维度索引需要被调整.Kn树的每个节点将具有完全Kn个孩子。确定子节点实际偏移的公式取决于为子矩阵选择的编号。确定子实际偏移的公式取决于为子矩阵选择的编号。如果我们以相反顺序(从n到1)的维度对子矩阵排序,则可以利用以下公式计算位置(v1,v2,...,vn)处的子矩阵的偏移:
 多维矩阵的任何其他排序可以被转换成类似的公式,其允许我们在每个维度中找到相应的子分区。
  使用公式的这种泛化,Kn-tree支持涉及其所有维度的高级查询,扩展K2-树的算法以在多维度中工作。回想一下第3.2节,K2树能够回答无约束的查询,要求特定行或列的查询,或涉及一定范围的行/列的查询。Kn-tree支持在相同约束的同时表示所有维度。

6.2.1.1 Check the value of a cell   

为了回答这个查询,我们需要在每个步骤确定哪个子矩阵包含所需的单元格。从根开始,我们检查单元格的坐标(c1,...,cn)以找到包含它的子矩阵。这只需要为每个ci计算值ci/(s/K),其中s是当前子矩阵的大小(在根处的总大小除以在每个级别的K).使用这个,我们获得一个元组(v1,...,vn),v属于[0..K-1],我们可以使用来找到子节点的位置,使用偏移公式:offset = v1Kn-1 + v2Kn -2 + ... + vn-1K + vn。如果相应的位被设置为1,我们发现它的孩子使用秩操作并递归地重复该过程。为此,我们简单地计算新的ci为c'i = ci mod(s/K),并在下一级使用新值。 重复迭代,直到我们找到0(单元格是0)或者我们在最后一个级别中达到1(单元格是1)。

示例6.5:在图6.3的矩阵中,我们想要检查坐标(6,3,0)(行3,列6,前层)处的单元格的值。 在相关联的K3树中,我们从根(T中的位置0)开始。将每个分量除以s/K = 4,我们发现包含单元的子矩阵是子矩阵(1,0,0),因此我们必须检查的子矩阵是在偏移1K0 + 0K + 0K2 = 1。正如我们在前面的例子中所示的T中可以看到的,该位是1,所以我们保持遍历并除以K.节点的子节点从rank1(T,1)×K3 = 8开始。同样,我们找到哪个子矩阵包含所需的单元格。在这种情况下,我们计算 ,它给出了在偏移1K0 + 1K1 + 0K2 = 3处的子节点(1,1,0)的位置。我们检查位置8 + 3 = 11的位,找到另一个1。当前节点的K3个孩子从位置rank1(T,11)×8 = 24开始。由于它大于| T |,我们在24- | T |处转到L. = 8。我们正在寻找的单元在子矩阵(0,1,0)中,因此其位在偏移量2处。因此,L中的位8 + 2 = 10包含单元(1)的值。


6.2.1.2 General range queries  
  
  Kn-tree中的所有查询都可以看作是一般n维范围查询的特殊情况。例如,询问单元格的值的查询在所有维度中设置长度1的范围,因此在概念树中的每个步骤只有可能包含所需单元格的子节点。在一般范围查询中,我们定义一组用于确定每个维中的约束的范围(r1,...,rn)。
  为了在Kn-tree中执行一般范围查询,我们将K2-树中支持的范围查询推广到更高的维度。从概念树的根开始,我们在每个步骤检查当前节点的哪些子节点包含指定范围内的单元格。同样,这可以容易地检查将范围的值除以当前节点的子矩阵的大小以获得候选子集的集合。检查每个子节点的位,并且只继续遍历值为1的子节点。作为附加计算,必须在每个节点处更新范围值以仅反映落入相应子矩阵内的子间隔。
例6.6:在图6.3的矩阵中,我们想要在三个最接近的层(0≤z≤2)中找到在行3(y = 3)中具有值1的所有单元。此查询为我们提供了必须在每个步骤检查的约束(0-7,3-3,0-2)。在树的根部,我们首先找到哪些子矩阵可以包含给定区域中的单元格。我们将间隔的极值除以s / k = 4,并且我们识别子矩阵(0/4 - 7/4,3/4 - 3/4,0/4 - 2/4)=(0 - 1,0 ,0)作为候选,它们的偏移分别为0和1.检查T中的比特,我们发现只有第二子矩阵包含1。我们遍历Kn-tree以定位rank(T,1)×K3 = 8并且去除落在当前子矩阵之外的部分的间隔,获得新的范围(0-3,3-3,0-2)。在新节点中,子矩阵(0-1,1,0-1)与范围相交。 它们的偏移量为2,3,5,7,但是在位置8 + 3 = 11处只有(1,1,0),在8 + 7 = 15处的(1,1,1)被设置为1。将对每个子矩阵重复该过程:11的子代在L中的偏移量8,并且新范围将是(0-1,1-1,0-1)。这些子矩阵的相对偏移是2,3,6,7。 检查相应的位,我们将在L的位置10和11找到单元(6,3,0)和(7,3,0)。对于位置15处的节点重复相同的过程,我们将找到它的孩子并且将单元(7,3,2)定位为查询的另一结果。

6.2.2 Enhancements to the  K n-tree  

  3.2节中介绍的基本K2树的所有增强功能都可以扩展到一个通用的Kn-树,可以通过简单的泛化方法或小的变化。在本节中,我们将描述可应用于Kn-tree的不同增强的实现:
  根据分解的级别,可以建立具有不同的K值的混合Kn-tree。这提供了与K2树相同的空间/时间折衷(小K导致高但相对较薄的树;大K导致较短的树 - 因此减少遍历数量,但每个节点的子节点数量增加)。通常,对于Kn树的大多数级别,使用的K的值将更小(通常为2),但是对于几个顶级级别可以选择更高的值(4或8)。 这种改变需要适应基本的遍历算法,如在K2树中。
  可以在K2树的相同步骤之后将矩阵词汇添加到Kn树的最后级。过程和数据结构没有显着变化:在给定级别,分解停止,并且得到的K0×。 。 .n×K'个子矩阵根据其总频率分配可变长度码。
  可以在构造Kn-树之前执行原始矩阵的分区。可以将原始矩阵转换为常规固定大小子矩阵的集合。需要调整查询算法以在导航期间考虑子矩阵的集合。
  具有1的压缩的变体也可以适应于更高的维度。提出的建议改变了原始的K2树数据结构,但是基本的导航算法非常相似。针对基本K2树解释的适配可以容易地扩展到任何具有所呈现的压缩的提议。


6.2.2.1 Concerns of high dimensionality problems  

  将K2树概念树推广到更高维度问题导致了概念树表示导出的一些问题。在概念Kn-tree中,如果每个节点的子矩阵至少包含1,则每个节点都有Kn个子节点。这已经是简单K2树中的一个问题:在K2树中选择K的值对于表示的整体大小具有显着的影响。这种效果是由于对于较大的K,树的较低级可能需要K2位来表示几乎用0填充的分支。
  在Kn树中,单元在树的大小中的分布的效果可能是显着的。对于孤立的单元格(不接近矩阵的任何其他单元格的单元格),必须创建概念Kn树中的长分支。在最坏情况下,具有非常少的单元的矩阵被设置为1,每个单元可能需要几乎Kn×logK s个比特来表示,因为在Kn树中创建的所有分支都是一元路径(即,概念上的 树在每个级别包含单个1).Kn树依赖于单元的聚类以获得良好的压缩,并且该依赖性随着K以及与n一起增加。
  本节前面提到的增强功能虽然直接适用于Kn-tree,但随着维数的增加,可能会得到更差的结果。对于n维矩阵,选择高于2的K的值对于概念树的所有级别将是不可行的; 因此如果我们想要减小树的高度,则混合方法是必要的。另一方面,混合树上只有在树的顶层中非常少的高K值。

  随着n增加,在Kn树的最后级中使用矩阵词汇也变得更加困难。由矩阵词汇获得的压缩不仅取决于子矩阵的频率分布,而且还取决于可以在小空间中表示的子矩阵的减少集合。即使对于子矩阵的小K0值,不同子矩阵的数目可能变得难以管理,因为每个矩阵必须使用(K')n位物理存储。
  最后,我们必须注意,压缩1的Kn-tree的实现也可能受到n的值的约束。基于使用第二位图用于节点的三种颜色的表示的建议(在第5.2节中呈现)应该可以无问题地扩展到Kn-tree。然而,第5.2.2节中提出的不对称提议随着n增加而明显降低:每个黑节点需要表示1 + Kn个比特。在其他章节中,我们将使用压缩Kn-tree中的一些的变体,忽略由于这种开销而使用这种不对称的建议的可能性。

6.3 Applications  

  Kn树,MK2树和IK2树可用于索引3维数据集,根据任何维度中的过滤器提供对数据的访问。然而,数据结构在如何索引数据方面显著不同,因此对于特定类型的数据集或查询,其中一个可能比另一个更合适。Kn-tree通过对任何维度的多维数据集进行过滤提供一种简单而有效的访问方式,其算法是对称和简单的。然而,Kn-tree性能可能随着维数的增加而显着降低,并且其压缩结果主要取决于在维度上的值的分布中的一些聚类级别或其他规则的存在。另一方面,MK2树和IK2树不是对称的,因为用于过滤分割维度的算法不同于过滤其他维度所需的简单遍历。IK2树特别是MK2树对索引分区维度的效率较低。最后,我们必须考虑到以下事实:MK2树和IK2树不依赖于分区维中的规则的存在以获得良好的压缩(它们将数据压缩为二进制关系的集合),而 如果数据集没有规则性,Kn-tree压缩可能会显着降级。
  在本文中,我们将集中在K2树变体的两个具体应用来表示多维数据:时序图的表示和光栅数据的表示。使用Kn-tree变体和我们的新数据结构的其他的一般光栅数据的表示将在本论文的第三部分中实现,其中我们将演示如何组合和应用我们的表示以获得一般光栅数据的紧凑和有效的表示 以及时空光栅数据。在本章的其余部分,我们介绍简单的模式来表示时序图,使用K3树和IK2树的新变体,称为diff-IK2-tree,专门用于存储时间信息。

6.3.1 Representation of temporal graphs using a K 3-tree  

  时序图可以被解释为三元关系,或3维网格X×Y×T,其中前两个维表示边的原点和目的地,第三维表示时间。这种表示可以使用K3树容易地存储,其将支持时间图中的常见查询。我们的表示可以轻松地支持查询,询问在特定时间点(时间片查询)的给定节点或节点范围的后继或前趋,或者在给定时间点检索图的完整状态:所有这些查询被减少到3-d范围查询,其中第三维T(时间维度)被固定为单个值。

  时序图的K3-树表示也可以回答时间间隔查询。在这种情况下,数据结构不提供这种直接访问来检索结果; 而是需要一些额外的过滤以根据其语义来获得查询的结果:

  询问其中单元/范围已经活动的所有时间点的简单时间间隔查询可以被回答,直接对K3-树执行三维范围查询。

  强时间间隔查询,要求在整个时间间隔期间已经活动的单元格,要求我们执行相同的3维范围查询以查找所有可能的结果。在这种情况下,必须以t的升序遍历每个节点的子节点。如果对于(x,y)对,区间内的t值具有值0,则对于相同的(x,y)停止遍历剩余兄弟。注意,这个过程只能在直接同胞组上有效地执行。为了在遍历期间有效地过滤每个边的结果,我们可以改变遍历过程以检查(x,y)的所有结果,即,我们遍历该特定顺序的树。然而,这种改变使得遍历更慢,因此在实践中,可以更快地提取矩阵中落入间隔内的所有单元,然后仅提取在完整间隔期间不活动的(x,y)对。

  弱时间间隔查询与其强对应物对称。 在这种情况下,一旦我们在K3-tree中找到第一个1,那么我们可以避免查找给定的(x,y)的兄弟节点。


6.3.2 Representations based on a collection of K 2-trees  


6.3.2.1 Naive approach: multiple snapshots of the graph  
  时序图的最简单的表示包括为每个时刻存储图的完整快照。这种简单的方法有一个明显的缺点:存储时序图所需的空间量随快照数目而增加,并且完全独立于图中发生的实际变化数。这意味着,对于1000个时刻保持不变的图将需要1000倍的初始图的空间,因为我们在每个时刻存储图的完整状态。
  即使这种方法在实践中是不可行的,因为它的空间要求,我们使用MK2树或IK2树提出其实现的草图。考虑在每个时刻的图的完整状态,两个数据结构的构造是直接的。为了回答查询,过程类似于解释的基本算法:
  我们可以在MK2-tree中回答时间分片查询,只查询与查询时刻对应的K2树。相同的查询在IK2树中作为固定值分区维度查询回答。
  为了在MK2-tree中回答时间间隔查询,我们必须检查该间隔的所有K2-树。此操作可以特别调整到查询中的不同语义:为了回答弱查询,我们必须检查所有K2树中的单元,直到我们找到单元活动的时刻;为了回答强语义查询,我们检查所有K2树,直到我们找到单元格不活动的时刻。注意,这些操作实际上是多个K2树的并集和交集,在第5章中研究了K2-tree1,但也可以在K2树中实现为基本操作。为了回答IK2-tree中的时间间隔查询,我们将使用范围受限的分区变量策略,并且我们可以针对这种情况优化查询:在弱查询中,我们只需要检查间隔中至少有一个,并且我们可能不会存储实际的活动值列表;在强语义查询中,如果节点在间隔中的所有位置中不包含1,我们可以停止遍历。
  刚才解释的快照方法非常有效地执行时间片查询,并且如果我们使用IK2树表示,也可以有效地回答时间间隔查询。然而,在大多数现实世界的时间图中,我们预期相对于图中元素的总数在连续时间戳之间的相对较小数量的变化。在这种情况下,将简单的多快照方法应用于图的紧凑表示在空间方面变得非常低效,因此,我们将仅使用该方法作为基线。

6.3.2.2 Differential snapshots: the diff-I K 2-tree  

  我们的方案也基于一个K2树的集合,稍后将被合并到IK2树中,像之前的方法一样。然而,在该提议中,每个K2树将是图的差分K2树表示。对于第一时刻,我们将存储时间图的原始状态的完整快照(即,我们在方法中使用的相同的K2树,对应于t0处的活动边缘)。然而,对于i> 0的每个Ki将仅存储图中在ti-1和ti之间改变它们的状态的边。在这种新的表示中,不同的K2树在时间图中需要每1次改变1次,而不是在每个时刻每活动单元1次。因此,如果图的边在t0处不活动,在t8处变为活动并且然后在t = 120处再次不活动,则我们将在K8和K120中的相应单元中存储1,而不是将单元存储在所有K2-树 间隔[8,119]。注意,由于如何构建K2树,在每个差分K2树中,当K2树中的内部节点Ki将被设置为1,当且仅当它在ti之间覆盖的区域中至少有一个变化时 -1和ti。图6.4显示了只有3个快照的时间图的概念分解。在图的顶部,我们显示了所有时刻t = [0,2]的完整快照。为了清楚起见,在完整的快照下面,我们显示了必须构建的“差异快照”。最后,在底部,我们显示每个快照的概念性K2树表示:t = 0时的完整快照和剩余时刻的参考快照。如我们在图中可以看到的,这种优化被设计用于具有相对较少数量的变化的时间图,其中差分快照显着地减少每个K2树中的1的数量,这也应该减少总体空间需求。
  为了回答差分K2树表示中的时间片查询(R,ti),我们需要在时间t重建每个单元的状态。然而,由于我们只存储每个单元格的更改,我们没有显式存储的状态。为了找到单元格的状态,我们需要计算t0和ti之间的变化数。注意,在t0,保持完整的快照,因此如果单元格被设置为t0,则它最初是活动的;每个改变基于先前状态,因此即使改变是单元的去激活和奇数改变(重新)激活。因此,如果“改变”(小区被设置为1的K2-树的数量)的数量是奇数,则小区在ti处是活跃的;否则,该单元是不活动的。 该计数操作可以用涉及对应于间隔[t0,ti]的所有K2-树的x或操作来实现。
  为了回答弱的时间间隔查询(R,I = [t`,tr]),我们需要执行适合于查询的语义的类似操作。按照弱语义,如果单元在t`处是活动的,或者如果它在t`和tr之间的任何点改变其状态(无论它是活动的还是变得不活动的,或者相反,我们将知道它是活动的 在某一点。我们可以计算这个执行一个x或操作,以检查单元是否在t`和在区间[t`,tr]中的一个或操作是活动的,以检查查询间隔内的更改。同样,必须根据在其它维度中确定的范围R来检查在K2树中扩展的每个节点的此操作。
  为了回答强时间间隔查询(R,I = [t`,tr]),这些操作与弱查询中的操作非常相似。在这种情况下,如果在t`处是活动的并且在查询间隔I内没有发生变化,则将返回一个单元。这可以使用x或操作来检查t'和a的状态,或者检查[t`,tr]中的变化的操作。
  请注意,在所有需要的查询中,必须执行涉及许多K2树的代价高的操作:我们总是需要在我们的查询中的时间瞬间或间隔之前对应于时刻的x或所有K2-树。在具有大量时间瞬时的许多时间图中,这些操作的成本可能变得太大,以至于该表示是不可行的。然而,我们可以使用构建在解释的K2树的集合上的IK2树来加速遵循相同的差分方法的操作。
 图6.5:图6.4中的示例的diff-IK2-tree表示。
  图6.5显示了图6.4中的时间图的等效“差分”IK2树表示,我们称之为diff-IK2-tree。在diff-IK2-tree的每个叶子中,我们为相关边缘中的每个变化存储一个位。 在IK2树的内部节点中,我们为每个时刻存储一个位,其中由该节点覆盖的至少一个小区发生改变。例如,节点N1表示邻接矩阵的行6,列5。 该单元在t0处是活动的,并且在任何其他时刻不改变,因此其位图在第一位置包含对应于t0的单个1(位的实际映射是t0和t2,如在位图中可以看到的 N0)。另一方面,表示行7,列5的节点N2在t0处是活动的,并且在t2处变为不活动,因此其位图包含设置为1的两个位,每个改变一个位。请注意,在这种情况下,diff-IK2-tree表示提供了执行查询所需的计数操作的巨大优势,因为每个节点的更改在最终位图表示中是连续的。正如我们将看到的,所有查询可以在计数操作方面被重写,其通过在K2-树的位图中的秩操作来解决:
  
  为了回答时间片查询(R,ti),我们像固定值查询一样导航diff-IK2-tree。在每个内部节点中,我们只停止当前节点的位图分支中的导航,所有位都设置为0,直到(并包括)与ti对应的位:这种情况指示当前子矩阵中的所有单元在t0处为0并且从未改变。当我们到达叶节点时,我们可以知道在ti计数t0和ti之间的数目的情况下该单元是否是活动的,这可以容易地用L上的2个排操作来计算。注意,我们需要为L添加秩支持,这在基本的K2树中不是必需的,但是空间的小增加提供了更高效的查询方法。时间片查询的成本不再依赖于ti,即当前时间点之前的时间点的数量。例如,按照图6.5的示例,如果我们想要检查N2的单元是否在t2处是活动的,则从diff-IK2-tree的根映射在对应于t2的位图中的偏移量。在第一级(节点N0)中,我们在t2之前发现一些变化,所以我们继续遍历,将t2的偏移更新为1.在下一级中,我们保持遍历,偏移不改变。最后,当我们到达N2时,我们知道对应于t2的比特是第二个比特。我们对位图中的1的数目进行计数,并获得值2,这意味着该单元在t2处是不活动的。 如果我们想要检查t1处的值,我们将执行相同的操作并获得奇数值(1),这意味着单元处于活动状态。
  为了回答时间间隔查询,我们在时间片查询中的行为完全一样:我们导航直到我们到达树叶,在树叶中,我们只使用秩运算检查更改的数量。
 
6.3.3 Experimental evaluation  



















第7章 K2-treap

  Top-k查询被广泛地用于各种领域,其根据得分函数计算多维数据集中的k个最相关的结果。在web搜索引擎中检索给定查询模式的k个最相关文档,在OLAP多维数据集中查找最有效的天或供应商或在地图中定位最高点是常见top-k查询的一些示例。最简单的top-k查询涉及查找数据集中的顶值,但是许多的查询需要计算数据的任何子集中的top-k值。例如,诸如“找到store_id在x0和x1之间,在日期y0和y1之间具有最高销售量的前10个商店”的查询可以被转换为范围Q = [x0,x1]×[ y0,y1]。如果我们将二维数据集视为n×m矩阵M,我们可以正式定义top-k范围查询作为查询,以根据它们在M内的二维范围Q内的权重来检索top-k点。
  在本章中,我们提出了一个称为K2-treap的新的紧凑数据结构,它能够在紧凑空间中存储多维网格,并设计成有效地完成top-k查询。我们的方案正如其名称所示,是受两个现有的数据结构的启发:K2树和treap。K2-treap能够完成一般top-k查询或top-k范围查询,但也支持其他更简单的查询,例如一般范围搜索。

7.1概念描述
  考虑矩阵M [n×n],其中每个单元可以是空的或包含范围[0,d-1]中的权重。我们认为M的K2树状递归分区为K2子矩阵。我们构建一个类似于K2树的概念性K2-ary树,如下:树的根将存储具有矩阵的最大权重的单元的坐标以及相应的权重。然后刚刚添加到树的单元格被标记为空,从矩阵中删除它。如果许多单元共享最大权重,我们只是选择其中之一。
  然后,矩阵在概念上被分解为K2个相等大小的子矩阵,并且我们向树的根添加K2个子节点,每个子节点代表一个子矩阵。我们对每个孩子矩阵递归地重复划分过程,为每个孩子节点分配相应子矩阵中最重的单元格的坐标和值,并删除所选择的点。
  该过程对于每个分支递归地继续,直到我们到达原始矩阵的单元或者我们发现完全空的子矩阵。注意,由于两种情况,我们可能会找到一个空的子矩阵:原始矩阵在当前节点覆盖的完整区域中不包含任何值/权重,或者具有权重的所有单元在构建过程的较早步骤中已被“清空”。
 
          图7.1:从矩阵构建K2-treap的例子。
  图7.1显示了K2-treap结构的一个例子,其中K = 2。在图像的顶部,我们显示在每个分解级别的矩阵的状态。M0表示原始矩阵,其中最大值被突出显示。 该单元格的坐标和值存储在树的根中,单元格将被“清空”或从矩阵中删除。在下一级(矩阵M1)分解中,矩阵在象限中分解,并且我们在每个象限中找到最大值(注意分配给根的单元在M1中已经为空)。在M1中突出显示的新的局部最大值被添加到概念树中作为根节点的子节点,处于通常的从左到右,从上到下的顺序。该过程继续递归,将每个矩阵细分为K2个子矩阵。选择为局部最大值的单元在对应于每个分解级别的矩阵中突出显示。
  当找到空子矩阵时,在所有分支中分解停止(空子矩阵在树中用符号“ - ”标记)。例如,按照图7.1的示例,N0的第三个子是空的,因为完整的子矩阵在原始矩阵中是空的。另一方面,N1的第一个子节点也是空的,即使原始矩阵在相应子矩阵中具有权重,因为该权重(7)已经作为N1中的局部最大值添加到树中并且从矩阵中移除 。注意,对于每个局部最大值,我们存储它的值和它的坐标,除了在树的最后级别,其中每个节点对应于矩阵的单个单元格,因此局部最大值的坐标可以隐含地从 树导向当前节点。

7.2数据结构和算法
   构成K2-treap的概念树实际上被划分在构成实际K2-treap数据结构的若干数据结构中。为了获得对K2-treap的所有分量的良好压缩,我们使用3个不同的数据结构来存储局部最大值的位置,局部最大值的权重和树形拓扑。此外,我们对存储在概念树中的数据执行一些转换,这允许我们获得更紧凑的表示。
  第一步是对数据应用一些变换,特别是对坐标和单元权重的数值进行变换,以便获得更多的可压缩值:
  坐标值:我们将所有坐标转换为相对于当前子矩阵原点的偏移量。树的每个级别上的坐标被转换成相应子矩阵中的偏移量。注意,这可以在构造过程中容易地计算,因为我们只需要考虑概念树中的当前水平并将每个坐标ci变换为ci mod(n / K')。在图7.2(上图)中我们可以看到这个变换后的概念树已经应用于图7.1的概念树。注意,例如,在计算它们的mod-4值之后,节点N1的坐标已经从全局值(4,4)变换到局部偏移(0,0)。在树的下一级中,N2的坐标再次从(6,6)变换为(0,0),等等。
  权重:应用于原始数据的第二变换是对局部最大值的差分编码。此转换在概念树的后序遍历中执行,将每个值替换为其值与其父值的差值。例如,在图7.2(上)中,计算节点N1的新值减去其父N0和N1本身的原始值,即N0,新值为8-7 = 1。正如我们所说的,这种变换被应用于概念树中的所有非空节点,并且可以在概念树的单次遍历(或者从底层向上遍历或者后序深度优先遍历)中执行。差分编码的结果是非负值的新序列,因为节点的值永远不能高于存储在其父节点中的局部最大值。如果在矩阵中存在接近值的规则,则新序列可以平均地由比原始值更小的值组成,因此应当更容易压缩。

            图7.2:概念树在我们的数据结构中的存储
  在数据转换之后,我们将每种类型的数据存储在不同的数据结构中,以利用其不同的属性:














Chapter 9   
dK2-tree的变体和应用

  上一章中介绍的dK2-tree提供了一种将基于K2树的静态表示应用到数据可能遭受变化的动态环境的简单方法。在本章中,我们将dK2-tree的不同特定应用程序引入不同的域,以便展示新数据结构的适用性和灵活性。一些方案将直接应用dK2-tree数据结构,而在其他情况下,我们引入一个问题的特定变体。
  本章的其余部分结构如下:在第9.1节中,我们介绍了基于dK2-tree集合的RDF数据库的动态表示,它增强了具有更新功能的现有静态表示。在9.2节中,我们展示了如何使第5章中提出的新编码适应dK2-tree,从而提供二进制图像的动态表示。在9.3节中,我们引入了一个时间图的动态表示的新建议。最后,9.4节概括了本章中的建议。

9.1 Representation of RDF databases  

  RDF数据集可以从数据快照构建,因此以静态形式存储。然而,在许多情况下,新信息不断出现,必须合并到数据集中以保持更新。如果我们使用数据集的静态表示,那么当信息更新出现时,必须重新构建完整的数据集,即使它们可能由与完整数据集相比较小的片段组成。
  基于K2树的RDF数据集的表示,称为K2-三元组,已经在4.2节中提出。该表示使用K2-树的集合来表示对应于RDF数据集中的每个谓词的三元组。这种表示被证明在空间和查询时间与现有技术的替代品非常有竞争力,但由于K2树的静态性质限制在一个静态上下文。
  在本节中,我们提出了基于dK2-tree的RDF数据集的简单动态表示,它简单地用每个谓词的dK2-tree替换静态K2树表示。本节的目标是证明基于dK2-tree的表示可以获得接近静态K2-三元组方法的查询时间。此外,dK2-tree表示提供了对RDF数据集执行更新操作的基础。

9.1.1 Our proposal  

  我们的方案是简单地用每个谓词的dK2-tree替换K2-三元组中的静态K2-树表示。我们考虑通过谓词对RDF数据集进行分区,并为数据集中的每个谓词构建一个dK2-tree。我们使用K2-三元组的相同策略来存储三元组的信息:对于每个谓词,我们考虑存储主语和对象之间的所有关系的矩阵与该谓词。所有矩阵将包含相同的行/列,其中主题对象(作为主体和作为不同三元组的对象出现的元素)将一起位于矩阵的第一行/列中,并且矩阵的其余行(列) 将包含剩余的主题(对象)。注意,元素的这种组织对于表示有效地回答连接查询而不访问用于在主语和对象之间映射的词汇表是必要的。
  我们基于dK2-trees的方案旨在解决RDF数据集结构部分的表示。在我们的方案中假设必须使用额外的数据结构来存储主语,对象和谓词的词汇表,以及它们与由dK2-trees表示的矩阵的行/列之间的映射。创建动态和高效的字典表示来管理大量的URI和字面值集合是一个复杂的问题,因为词汇表可能构成RDF数据集[MPFC12]总大小的很大一部分。
9.1.1.1 Query support  
  正如我们在第8章中所展示的,dK2-trees支持静态K2树支持的所有基本查询,因为我们的表示支持使用动态位图实现的概念树上的基本索引操作。因此,我们的方案可以直接回答所有三元模式查询:(S,P,O)和(S,?P,O)查询实际上是单元检索查询(涉及一个dK2-树或集合中的所有dK2-树) (S,P,O),(S,P,O),(ΣS,P,O) ?O)是一个全范围检索查询,要求dK2-tree中的所有单元格。
  连接操作也可以使用dK2-tree完全类似于静态K2-树来回答。 让我们考虑在K2三元组中使用的三个连接策略:
  独立求值将两个三元模式查询中的任何连接操作和与两个查询的结果相交的简单合并分开。使用所解释的基本操作来立即使用dK2-树。
  链评估是类似的,在连接操作被转换为三元模式操作的集合的意义上。对于涉及两个(或更多个)三元模式的任何连接操作,我们可以将连接分解为其基本模式,并使用dK2-trees中可用的基本操作以任何顺序链接执行。
  交互式评估是一种更复杂的操作,其中同时遍历两个K2树。此策略的基本元素包括概念树的同步遍历,类似于第5章中描述的静态K2树的集合运算(特别是交集运算),并且可以直接应用于dK2树。不管连接操作的类型或复杂性,交互式评估的基本步骤基于对不同的概念树中的一个或多个节点的访问
K2树来检查它们的值并且确定是否在剩余概念树的当前分支中继续导航。所有这些操作都由dK2-trees直接支持,只使用概念树上的基本遍历操作。

9.1.1.2 Update operations using d K 2 -trees  
  我们的方案能够完成K2-triples支持的所有基本查询,只是简单地用dK2-trees代替静态K2树,并假设字典需要相同的组织来管理三元组中的值。在本节中,我们将展示RDF数据集中的更新操作可以轻松地由我们的方案支持。这被表示为dK2-树对该域的适用性的概念的证明,即使我们的建议仅关注三元组的表示。
  RDF数据集中最常见的更新操作可能是在对应于定期检索或索引的新信息的小集合中一个接一个或更频繁地插入新的三元组。在现有RDF数据库中插入新的三元组涉及基于字典编码的我们的表示中的几个操作:
   首先,必须在字典中搜索新三元组的主语,谓词和对象的值,并在必要时添加。如果所有元素存在于字典中,则新的三元组被存储为与其谓词相对应的dK2树中的新条目。
   如果三元组对应于新的谓词,则可以创建新的空dK2树以存储新的主题 - 对象对。
   如果主题和/或对象是新的,我们必须向所有dK2树添加新的行/列。这种操作在dK2-树中通常是微不足道的,因为由dK2-树表示的虚拟矩阵总是具有K的大小功率,并且许多行/列可能未被使用。在这种情况下,要添加一个新的主题/对象,我们只需要保留将要使用的新行/列的计数。当所有行/列都满时,我们必须增加矩阵的大小,一个操作(具有与在矩阵中插入新的1相当的成本)必须在所有dK2树中重复。对于大小为n×n的矩阵,该过程创建(K -1)n个新的可用行/列,因此这种昂贵的操作应该很少被执行。K的较大值可以用在概念树的上层中,以进一步减少我们需要扩展矩阵的次数。

   删除三元组以更正或删除错误信息也是RDF数据集中的典型更新操作。删除三元组时可能发生的更改与插入情况类似:当删除新的三元组时,如果主体/对象没有相关联的三元组,我们可能需要简单地从dK2树中删除1或删除行/列(将其标记为未使用)。 

检测目标对象更改:必须考虑的特定情况是插入三元组,使三元组导致目标(对象)成为目标对象(或删除三元组,仅转换目标对象为对象或目标)。
   我们假设在我们的表示中,主题对象元素被一起存储在矩阵的左上区域,使得连接操作不需要执行额外的计算。在动态情况下避免问题的简单解决方案是使用不同的设置,其中矩阵的行/列将包含所有元素(主语和对象),而不是仅存储行中的主语和列中的对象。



















第四部分
论文总结

第13章  结论和未来工作

13.1主要贡献
  近几十年来以数字形式存储和处理的信息量呈指数级增长。现在,大量信息从多个源实时获得,并且必须有效地处理和访问这些信息。因此,有效处理越来越多的可用信息在不同领域中均已成为的一个非常重要的挑战。
  遵循几种策略来处理大量可用的信息,从并行处理数据到为特定目标设计并创建特定硬件架构。开发能够减少数据使用空间的紧凑表示是最有效的研究路线之一。这些表示允许我们处理存储器层级的高层级中的数据,并且因此由于层级之间的速度差而能够更快地处理数据。开发紧凑或简洁的数据结构已经受到了很多关注,这种方法不仅能够存以压缩形式储数据而且能够完成查询。
  在本论文中,我们主要专注于二维或n维数据的紧凑表示。我们的目标是为网格提供高效的表示,使它可以很容易地应用于二进制或n元关系,图形等的表示。我们还特别感兴趣领域是具有“空间”分布的数据(例如地理数据)。我们研究一组相关的问题,在不同领域与网格的紧凑表示相关联。
  本文的主要贡献是在不同的上下文中应用紧凑数据结构的集合。我们在这一节进行总结。 首先,我们提出了几个一般数据结构在不同的领域的应用:
  我们提出了一个表示集合,称为压缩的1的K2树或K2-tree1。这些表示是现有数据结构(K2-树)的扩展,以有效地表示具有1和0的大区域聚类二进制网格。我们提供一小组不同的编码,经典K2树的扩展极大地提高了它们在集群网格中的压缩能力。在理论上和实验比较我们的表示方法与二进制图像的最先进的表示方法,结果显示我们的表示方法提供高效的查询支持和实现非常有竞争力的压缩结果。这些表示也用于改进本论文中研究的其他方案的变体。

  我们为n元关系的紧凑表示引入了一种新的数据结构,称为Kn-tree。这种表示是将K2树推广到更高的维度。我们研究它的适用性和在一般情况下的缺点。
  我们提出了一种新的紧凑数据结构来完成多维网格中的top-k查询,称为K2-treap。
  我们拓展了一个新的动态表示的网格,称为动态K2树或dK2树。此表示能够回答静态K2树支持的所有查询,并支持网格上的更新操作,包括更改单元格的内容和插入新行/列。
 
  除了可以将新数据结构的方案应用于不同领域的之外,我们还关注所提出的新数据结构的应用,并创建了一些新的数据结构的新变体,以解决每个应用领域中的具体问题:
  我们研究了OLAP多维数据集的表示,特别是top-k查询的问题,作为多维数据库中经常需要的特定查询。我们实验评估我们的方案K2-treap,并与相比。实验表明,我们的表示在大多数情况下的比基于小波树的最先进的方法更小和更快。
  我们还研究了时态图的表示。 在这一领域,我们开发了一种新的数据结构,称为差分IK2-tree或diff-IK2-tree,一种称为IK2-tree的现有数据结构的变体,它能够在非常简化的空间中存储时态曲线图。我们还显示了K3树对时态图表示的适用性,将时间视为另一个维度。我们的实验评估表明,我们的方案是时态演变数据表示的完全替代品。在第9章中,我们还表明,可以使用我们的动态K2树表示来构建时态图的完全动态表示。
  我们研究了RDF数据库的紧凑表示,这个问题已经使用K2-树解决[ÁGBF+ 14],但仅限于静态上下文。在第二部分中,我们利用所提出的动态表示来提供支持相同查询的动态替代。我们的实验评估侧重于与静态版本的比较,这是一个非常与最先进的方案相比最具有竞争力的替代品。我们的结果表明,在大多数情况下,我们的动态表示所需的开销很小。
  最后,在论文的第三部分,我们使用本文开发的紧凑数据结构研究光栅数据的表示。我们研究三个不同的问题,并为每个问题提供具体的解决方案:
  我们基于论文中提出的不同建议,提出了一般栅格数据表示的几种替代方法。我们的所有方案完成域中最重要的查询,包括限于空间窗口的查询或具有给定值/值范围的单元格。对于这个问题我们设计一般数据结构的特定变体:MK2-tree1是基于多个具有特定集合运算的K2-tree1的简单表示;AMK2-tree1是特定于此问题的变体,其优化涉及值范围的查询;K3树直接应用特定算法; 针对这个问题专门开发的IK2-tree1是IK2-tree与K2-tree1的组合,以提供更好的索引属性。我们所有的表示在这个领域的特定查询具有优势。此外,我们还提出了K2-treap的两个变体,特别适用于回答栅格数据中的top-k范围查询。









































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值