Compressed kd-tree for temporal graphs

        时间图表示沿着时间变化的顶点和二元关系。本文中的工作提出将时间图表示为4D二进制矩阵中的单元:两个维表示边缘的极端顶点,两个维表示当边缘存在时的时间间隔。该策略概括了用于存储静态图的邻接矩阵的想法。 所提出的称为压缩k d -tree(ck d -tree)该结构能够处理具有良好使用空间的未聚类数据。ck d树使用渐近地与用于在4D二进制矩阵中存储单元的(最差情况)下限相同的空间,而不考虑任何规则性。


1. Introduction

        时间图是其中顶点之间的连接性随时间改变(即,边缘可以出现和消失)的图。它们对于建模数据是有用的,例如当用户在在线社交网络中添加或移除朋友时友谊关系的演变,当新科学文章被发布时网络引用的动态性,当移动设备改变其基础站点时移动设备之间的时变连接性或在Web图表中链接出现或消失的更改。 使用时间图,不仅可以获得当前顶点之间的连接状态,而且能够获得顶点之间的连接的历史状态。一般的,我们将时间图视为一组顶点之间的联系,指示顶点连接的时间间隔[35]。

          时间图可以表示为几个静态图(或快照),在图的存在时间中存储每个时间点的活动边[22]。这个策略的主要问题是边长时间保持在相同的状态(活动或非活动)下使用空间。克服空间问题的策略是存储一些快照(仔细选择)之间的差异,但是在运行时处理差异的开销[17,33,37]。其他策略是基于存储随着时间激活或停用的事件。使用这些方法,通过计算查询边上发生多少次事件来恢复边的状态:偶数次表示边有效,否则为无效[12]。

          使用多维方法,连接可以看作由4D二元矩阵表示的4元组[5]。对于2元组,k2-tree [10]在Web图、二元关系和栅格数据上获得了很好的效果,因为它能够在很小的空间内表示聚类数据。kd-tree [16,18]是k2-tree的多维版本。因此,k4-树是kd-树的4元组版本[18],其表明不适合压缩未展现2元组聚类属性的时间图。

        本文的工作提出修改kd树[16,18],目的是减少使用未分组数据的空间,同时保持良好的时间性能。因此,基于将时间图表示为整个时空数据结构(相同表示中的混合节点和时间)来提出两个压缩数据结构ckd-tree和bckd-tree,其能够恢复在任何时间没有存储快照并且未计算更改次数的边的状态信息。约束在特定时间点或时间间隔,我们关注在节点和边上的相邻操作时间(即,检索直接/反向邻居,检查边缘是否活动,或获得图的快照)。

        本文的组织如下。 第2节介绍了有助于解释所提出的结构和概述相关工作的主要概念。第3节介绍ckd树,包括结构的描述,其基本访问操作和其在空间中的分析成本。第4节展示了如何使用ckd-tree表示时间图,以及如何解决时间图上的操作作为ckd-tree上的范围搜索查询。ckd-tree的进一步改进在第5节中给出。第6节提供了关于使用不同类型的时间图的基线和现有技术结构的所提出的结构及其变型的实验评估。最后,第7节给出结论和未来的研究方向。

 图1.时间图和快照的示例:a 五个节点中的一组联系。b  在时间t = 5处的活动边的快照对应于连接组上的虚线(根据[35]修改的图)


2 Preliminary concepts and related work

        在本节中,我们介绍本工作中采用的时间图的定义,总结时间图现有结构,并修订更详细的与本文提出的结构密切相关的结构。

2.1 Temporal graphs

        一般的,时间图是在表示图在一组时间点T(具有总次序)期间一组顶点V之间存在连接的集合C.边(u,v)∈E⊆V×V的连接是四元组c =(u,v,t,t‘),其中在时间间隔[t,t’)× T中(u,v)是有效的[35]。我们用n = | V | 表示顶点的数量,m = | E | 表示边的数量,τ= | T | 表示图的生存期中的时间点的数量、c = | C |表示连接的数量。正如尼科西亚[35]声称,我们假设对于给定边缘没有空的或重叠的间隔。这是给定两个连接(u,v,ti,ti'),(u,v,t j,tj')∈C,那么ti <tj,且仅当ti'<t j'。我们称这种边的时间属性为时间约束。我们将聚合图命名为由时间图中的边E的集合组成的静态图。图1示出了时间图的示例。

        接下来,我们将说在时间点tq处连接(u,v,t,t')是活动的如果tq∈[t,t'),并且它在时间间隔[tq ,tq')中也是活动的,如果[tq,tq')在[t,t')期间。

        时间图上的操作使用时间标准来扩展对静态图的查询[12]。查询可以分为四个类:(1)关于顶点的查询,检索顶点的活动直接/反向邻居,(2)查询边,检查边是活动的还是停用的或检索边的下一激活时间,(3)查询图,检索所有边的活动或停用状态,(4)查询关于边上的事件/变化,恢复被激活/停用或两者的边。这些查询可以被约束到时间点或时间间隔。对于关于时间间隔[t,t 1)中的顶点和边的查询,我们考虑两种可能的语义:(1)强语义,其检索在间隔[t,t)期间活动的联系,(2)弱语义,其检索在间隔[t,t')内发生过联系。表1示出了时间点的操作的定义,表2示出了图1a中的图的操作的示例。关于对时间图的查询的详细评论,参见[12,第3-5页]。


表1 由时间点约束的时间图上的基本操作
关于顶点 直接邻居(u,t):返回在给定时间点t时刻u的相邻活动邻居节点
反向邻居(v,t):给出在时间t的v的活动反向相邻顶点
关于边缘 Edge((u,v),t):如果边(u,v)在t时有效,则为真,否则为假
EdgeNext((u,v),t):返回t之后(u,v)的下一个激活的时刻,如果它是激活的, 否则返回∞
关于图表 快照(t):在时间点t返回所有活动边
关于活动 激活边(t):返回在时间点t激活的所有边
停用边(t):返回在时间点t停用的所有边
更改边(t):返回在时间点t激活或禁用的所有边
   
   

表2  图1中的时间图的基本操作的示例


操作 点tq = 1 间隔tq = [3,5]
Weak Sem

Strong Sem
a的直接邻居 {b} {b, d} {}
b的反向邻居 {a, d} {a, d} {d}
边(a,b) True True False
EdgeNext of (a, d) 3 --  
Snapshot {(a,b), (d,b)} --  
激活边 {(a, b)} {(a, d), (b, c), (b, e), (e, d)}  
停用边 {} {(a, b), (a, d)}  
改变边 {(a, b)} {(a, b), (a, d), (b, c), (b, e), (e, d)}  


         时间图可以根据其接触的持续时间分类[28]。 如果连接的持续时间总是时间点,例如具有(u,v)∈E和t∈T的形式(u,v,t,t + 1),我们说该图是点连接时间图; 否则,我们说它是间隔连接时间图。 时间图也可以通过其动力学分类[19]。我们说,如果任何边的连接发生在许多时间点,则时间图是完全动态的。如果每个边只在一个时间点存在连接,我们称该图是部分动态的。如果所有连接在图的生命周期开始时存在,我们说图是递减的,因为随着时间的推移,有效边越来越少。相比之下,如果所有连接在生命周期结束时结束,则时间图是增量的。

       根据图的类型,某些操作始终为空或等效于其他操作。例如,在点连接图上使用强语义的时间间隔查询总是返回空,因为所有连接的持续时间是时间点。对于增量图上的停用边操作也会发生同样的情况,这些操作也会返回空,因为所有边都保持活动状态,直到生存时间结束。这也意味着,如果我们在图的最后一个时间点要求停用边,则该操作等效于快照,因为所有边在生命周期结束时被。

        在增量图中,查询间隔[t,t')上的弱语义可以通过对t'进行时间点查询来计算。这是因为随着连接总是在生命周期结束时结束,右端点t’的查询间隔获取所有激活连接。强语义也是如此,这可以通过t上的时间点查询来回答。在点接触图上,时刻t的激活边的操作可以被计算为快照(t),因为所有边仅在一个时刻是活动的,并且在t的激活边也是在t处活动的边。类似地,时间瞬间t的停用边可以被计算为快照(t -1),因为在时间t的停用边是在t-1激活的边。


2.2 Existing structures for temporal graphs

        用于表示时间图的最简单的方法是基于在图的寿命中为每个时刻存储具有活动边的快照(或多个静态图)。该表示的示例是存在矩阵[22,p 3],大小为m×τ的二进制矩阵,其中每个单元(i,j)表示时刻j处边i的激活状态。该策略的主要问题是对于长时间保持在相同状态(活动/非活动)的边过度使用空间。这是因为需要新的单元,虽然以下时刻的状态与当前时刻相同。

        G *数据库[33]是基于快照表示的分布式索引,通过实现仅当新状态时才存储新版本的边来解决空间问题。它们对于每个时刻保持指向当前活动边的指针,由一组邻接列表表示。如果边在下一时刻变成活动状态,则创建用于存储新边的新邻接列表。然后,它们将时刻指针更新到这个新的邻接表,而且保持指向最后一个时刻的邻接表的指针。如果没有边在下一时刻改变其状态,则它们指向最后一个时刻。虽然这种机制节省了空间,但是如果在一些更改后,当前快照正好是上次更改之前的快照,则工作效果不会很好。DeltaGraph [31]也是一个分布式索引,它进行基于分层结构中的公共边分组。这是一个类似的想法,在意义上存储不同版本的边,但它能够考虑到,未来在发生一些变化之前的快照可以完全相同。

        另一个策略是将时间图存储为事件的对数[22,p6]。该日志存储沿着时间激活/停用边的事件,并且与快照表示相反,空间使用取决于与每个边相互连接的的数量。然而,该方法的主要问题是获得边的状态所需的时间,因为它是通过顺序遍历与边缘相关的事件而获得的。

        已经进行了一些尝试来改进处理日志事件所花费的时间。最简单的策略是将日志与快照组合。这些快照就像在某些时刻的图状态的采样。FVF框架[37]通过聚类处理获得一组代表性的快照。然后,对于每个时刻,存储与改变相关的最相似代表性快照。 然而,他们仅仅专注于解决邻接查询时间。

        时间图压缩的研究仍处于早期阶段。这里,压缩策略的空间以每个连接的比特数(bpc)来测量,即,在主存储器中具有图所需的位数除以连接数量(边沿有效时的时间间隔)。

        在[41]中提出了一种基于邻接表的策略。该想法是将图表示为一组邻接列表,但是对于每个邻居,其存储指示边何时是活动的时间间隔的列表。这个想法的压缩版本是在[12,p 9]中给出EdgeLog。这里,邻接列表和时间间隔都用间隙编码存储。虽然这种策略非常快,但它不能很好地压缩,并且它还需要一个外部结构来检索反向邻居。

        邻接日志(EveLog)[12,p10]是基于事件日志概念的压缩结构。EveLog为每个顶点日志建模两个分开的列表:一个用于表示时间瞬间,另一个用于表示与事件相关的边。时间点列表用间隙编码进行压缩,边列表用统计模型进行压缩。通过对与边相关的相邻日志的顺序扫描来获得边的状态。这种方法的问题与用于检索边状态的日志的顺序扫描的时间有关。

        在[17]中,快照和日志都被压缩在k2-trees [10]。日志被建模为差分,表示在两个连续时刻之间变化的边。该策略的时间性能通过ik2-tree [25]得到了改进,ik2-tree对应于每个k2-tree的位图的特殊排列。位图的这种排列允许通过计算边在日志中出现的次数来检索边的状态。假设所有边在时间开始时是不活动的,列表中的边的第一次出现意味着边变为活动状态,第二次出现意味着边变为停用状态等等。因此,如果它出现偶数次,则意味着边是停用的; 否则,它是活动的。ik2树的好处是减少了空间,并且能够使用相同的空间解决反向邻居(顶点的前趋)。但是,如我们在实验部分所示,检索时间取决于需要多少事件来获得边的状态。

        在[12]中的工作提出了另一种解决处理日志问题的策略,其基于快速计数方法来检索边的状态。他们提出了CAS,一种基于由所有顶点的事件的日志的级联组成的序列的紧凑数据结构。要检索边的状态,它们还计算边在事件日志中出现的次数。对于快速计数,他们使用小波树[27],一个能够在对数时间检索符号显示频率的数据结构,无论序列的大小。作者还提出了CET,其还将事件的日志建模为按时间排序的序列(而不是顶点)。它们开发了用于表示多维符号序列的小波树的扩展,称为交织小波树。交织的小波树允许在对数时间中检索多维符号的任何分量中的符号的频率。边的状态也通过计算边出现的次数来恢复。虽然两种结构都能够使用相同的空间来应答反向相邻,但是只有CET能够以相同的时间成本来应答反向和直接相邻。

        Brisaboa [5]提出了一种基于用于大字母的压缩后缀数组(CSA)的结构[21,39]。时间图被表示为4元组的序列,其中每个元组表示连接。该序列由四个不同的字母组成,每个组成一个四元组。这四个不相交的字母表产生用于压缩CSA的新的属性,后缀数组的第一个属性总是指向第二个的符号,第二个总是指向第三个季度的元素,依此类推。要检索边的状态,他们搜索由边组成的模式。然后,他们检查在查询时间是否至少有一个活动的连接。此策略比CAS和CET需要更多的空间,但它允许以相同的时间成本检索直接和反向邻居。

2.3 Multidimensional compact data structures

        连接可以自然地表示为4D二进制矩阵中的单元,具有两个维度编码边,其他两个编码时间间隔。在本节中,我们回顾一些具有两个或更多维度的二进制矩阵的压缩表示,可用于表示时间图。我们从k2-tree [8,10]开始,这是一个紧凑的数据结构来表示稀疏的二进制矩阵。它利用稀疏和规则性在许多真实世界矩阵中实现良好的压缩比。k2树已经成功应用于不同的内容,如Web图[10],二元关系[6],地理栅格数据[16],RDF数据库[3]和时间图[17]。我们还审查kd树[16,18]和交织k2树[24,25]。 前者是k2树的d维扩展以处理多维矩阵,后者是用于将3D二进制矩阵存储为若干2D矩阵的k2树的专用化。


2.3.1 The k2-tree

        在概念上,k2-tree [8,10]对应于MX四叉树[40],具有树形的简洁表示。树使用广义Jacobson的级序[7,30]编码为k2的基数树。该表示基于二进制序列,其能够表示度为k2的N个节点的树,经典的基于指针的表示用Nk2 + o(Nk2)比特而不是O(Nk2log(Nk2))比特活动单元的位置被编码为根到叶路径(如在特里树或前缀树中)。当活动单元被聚集时,k2树的效果最好,因为叶共享大部分的根到叶的路径。

       存在基于减少根到路径路径(即,压缩四叉树[4,13]和跳过四叉树[20])的长度来压缩四叉树的方法。 然而,它们不减少用于编码二进制矩阵上的单元的位置的空间。线性四叉树[23]是用于压缩小区位置的Quadtree的另一编码,其不利用由类似的根到叶路径共享的前缀。线性四叉树[23]是用于压缩单元位置的Quadtree的另一编码,其不利用由类似的根到叶的路径共享的前缀。k2树是树本身对数据(即,活动单元的位置)进行编码的结构。

         k2树通过将输入递归分解成大小为n / k×n / k的k2个正方形子矩阵来存储n×n二进制矩阵。输入矩阵的递归分解继续,直到子矩阵具有大小k×k,对应于表示k2个单元的叶节点。每个子矩阵,树的每个节点具有k2个子节点。 它们从0到k2 -1编号,从左到右和从上到下。每个子矩阵使用单个bit来表示:如果子矩阵具有至少一个单元,则表示为1,如果子矩阵为空,则表示0。因此,如果子矩阵为空,则其子代不在下一级中表示。 该方法对于每1个孩子矩阵递归地进行,直到当前子矩阵充满零或者我们到达原始矩阵的基本单元。在该表示中,矩阵的每个活动单元对应于树中的路径; 类似地由二进制尝试使用的机制。这意味着,为了检查单元的状态,应该检查是否存在路径直到在级别h =Δlogkn的叶子。 图2示出了k = 2的k2树的示例。

        注意,k2-tree不存储每个子矩阵的边界。相反,这由从根节点的路径隐含地表示。由于根节点表示整个矩阵,其左上角位于(0,0),右下角位于(n,n)。当我们向下遍历树时,可以计算内部节点的边界。令(x,y)是根节点的左上角,其中n×n是矩阵的大小。根据定义,每个子节点的子矩阵的大小为n / k×n / k。i-child的左上角由(x,y)定义,x = x + n / k×(i mod k),y = y + n / k×(i / k mod k)。右下角由左上角加上子子矩阵的大小,即(x 1 + n / k,y 1 + n / k)。继续递归,直到我们找到叶节点或空子矩阵。这给我们一个时间来检查对应于树h的高度O(log k2 n2)= O(log k n)的单元的状态。

        k2树被水平遍历并存储在两个位阵列中:T存储内部节点,并且L存储叶节点,如图2所示。T中位置p处1位的第k2个子节点中的第一个位于位置p‘= rank1(T,p)×k2。如果p大于T的大小,我们将访问数组L位置p处p“ = p‘ - | T |。请注意,此属性成立,因为在k2-tree级别设置为1的每个位将k2位添加到下一级。 另一方面,设置为零的位没有子节点。

        k2-tree使用的总空间取决于输入的分布。 完整的分析如[10]所示。基本上,在最差情况下(对于具有m 1s的均匀分布的大小为n×n的矩阵),总空间是k2m(logk2(n2 / m))+ O(k2m)比特。在真实的集合,如Web图表[10]或空间数据[16],这个上限是远的。实现压缩是因为在这些域中数据被聚类,其生成共享来自根的高路径部分(即,自相似性)的叶节点。实际上,不同的节点排序影响矩阵中被聚类的1的多少。改进空间的一个简单策略是通过跟随广度优先搜索[2]来重排(或重命名)节点。

        由k2树支持的不同操作的时间成本还取决于矩阵的特性。Ladra [10]用不同的Web Graph进行实验,表明与具有均匀分布的1的矩阵相比,聚类矩阵具有更好的性能。

        已经提出了一些增强以改善k2树的空间和时间性能。这些改进使用以下策略:在树的不同级别改变k值,压缩位图L(树的最后一级)和压缩充满1的子矩阵。下面简要说明这些改进。

        混合k2-tree k的较高值产生较短的树,以增加空间为代价提高查询时间。Hybrid k2-tree [10]混合k的不同值,第一级的值较高,最后一级的值较低。使用该策略,最终数据结构的空间保持相同,但是在具有1s的聚类分布(即,Web图)的矩阵中时间性能改善。

        k2树的最后一级L的压缩表示大小为k×k的子矩阵。 减少L的空间的替代方案是在最后一级创建非空子矩阵的词汇表,通过其频率对其进行排序,类似于统计压缩。然后,L位图可以由指向子矩阵的词汇表的整数列表代替。由于子矩阵的偏斜分布,整数的可变长度编码表示将减少空间,因为小数字应比大数字更频繁。Ladra [10]使用可直接寻址代码(DAC)[9]压缩这些整数,其主要属性是直接访问任何位置。此外,通过采用更大的子矩阵k1×k1可以实现更好的压缩,这就是,停止在更高水平l <h -1的递归分解。和混合k2树一样,实验表明,该方法仅在矩阵具有1的聚类分布时效果较好。

        de Bernardo [16]提出了一种k2-tree的变体全域区域的压缩,用于在表示栅格数据的矩阵中压缩更大的区域。基本思想是当区域充满零(如在原始k2-tree中)或当子矩阵充满1时停止递归分解。他们开发了两种策略来对k2树中的新种类的节点(即,编码充满1的区域的节点)进行编码。在2比特变体中,空和全1子矩阵都用T中的0来编码。为了区分T中的位置p是空的还是满的,它们添加第二位图T'。如果位置T∈[rank0(T,p)]被设置为0,则意味着该区域为空; 否则,它是充满了1。这种机制允许保持k2树相同时间性能减少使用的空间。


2.3.2 The kd-tree

       kd-tree [16,18]是用于表示d维二进制矩阵的k2-tree的泛化。 尺寸为n1×n2×...×nd的d维矩阵被递归地划分为kd个子矩阵。为了简化分析,我们假设对于所有i,ni = n,其中树的每个节点具有表示每个子矩阵的kd个子节点。子矩阵从0到kd-1编号,遵循行主序.这意味着第一维度对于第kd-1子矩阵是连续的(即,子矩阵按照最高维度排序,然后第二维度依次排序 上)。将树编码为位图T和L遵循相同的策略:子矩阵的1位是非空的,否则为0.图3示出了k = 2的kd树的示例。

       树的导航类似于k2树中的导航,在T中的位置p处的1比特的第一个孩子被发现在位置p' = T | L中的rank1(T,p)×kd(位图T和L的级联)。为了检查在输入矩阵中是否存在单元c =(c1,c2,c3,...,cd),我们需要检查哪个子节点表示c落入的子矩阵。从根节点开始,这需要为每个维度计算值vi = ci /(n / k),其中n是当前子矩阵的大小。然后,  的第j个子矩阵包含节点。 如果第j位被设置为1,它使用秩操作向下遍历kd树,但是通过ci' = ci mod (n / k)更新ci以反映相对于j中的较小子矩阵的新位置 子节点。该过程持续到我们找到叶节点或空子矩阵。 检查单元的存在的导航时间是O(logkd nd)= O(logk n),其对应于树的高度h =logkn。其他范围操作取决于使用值固定多少个组件,以及应在每级检索多少个子矩阵。

        在[10]中对k2树进行相同的空间分析之后,在尺寸为nd且m 1s均匀分布的二维二进制矩阵的最坏情况下,kd-树使用的空间是  位。对于k = 2,空间达到其最小值位,这个等式揭示了kd-tree的问题之一; 其空间随着维数而呈指数增长。

        由于kd树基于k2树,所以可以应用k2树的相同优化技术来减小其空间和时间性能,只需调整导航模式。

2.3.3 The Interleaved k2-tree
       交织k2树[24,25]是专门设计用于处理3D数据的k2树的特殊化。在其维度之一表示具有偏斜分布的三元关系是有用的。主要思想是将三元关系划分为m组二元关系,其中m是偏斜维度中不同值的数量。然后,三元关系可以由m个不同的二元关系表示,每个关系由不同的k 2树表示。
         分区的工作方式如下:令W为包含形式(x,y,z)∈X×Y×Z的三元组的集合。假设集合Z具有比X和Y低的基数并且| Z | 是Z中不同项目的数量。然后,分区被定义为| Z |的集合 不同的形式为Zi = {(x,y)|(x,y,z)∈W}的二元关系。最后,每个Zi关系由k2树中的二进制矩阵表示。

         交织的k2树(ik2-tree)对应于| Z |的合并 不同的k2树在一个结构。该想法是交织表示| Z |的相同分支的位 k2树。 如在k2树中,每个节点具有k2个子节点,每个节点表示具有可变位数的子矩阵。每个位表示偏斜维度的一个项zi。 在第一级,每个k2节点包含| Z | 位,Z中每项一个。如果Zi矩阵在节点的相应子矩阵中包含至少一个单元,则节点的第i比特被设置为1; 否则,该位设置为0。

         在以下级别中,每个内部节点的比特数对应于其父节点中的1的数目。例如,如果父节点具有m 个1,则其k 2个子节点中的每一个将包含m位。父节点中的1的数目指示在其相应子矩阵中具有单元的Z中的项目的数目。在该示例之后,父节点中的1的数量指示存在m个不同的Ri矩阵,其中子矩阵中的小区与父节点相关。图4示出了具有k = 2和三个zi值的ik2树的示例。

         树还存储在两个位阵列中:T存储除了最后一个之外的所有级别,其存储在位图L中。对于ik2树,原始k2树的结构性质保持,级别1中的1位将在级别1 + 1处生成k2位。然而,由于每个节点具有可变数量的比特,并且每个节点的比特数量取决于父节点的活动比特,因此必须相应地更新导航策略。因为我们知道第一级中的每个k2节点包含| Z | 位,我们必须通过跳过第一个| Z |×k2比特来调整导航。

        假设从T中的位置p开始的节点,m> 0活动位。然后,第一个孩子从位置p‘开始 P' =(rank1(T,p)+ | Z |)×k2,并且在T | L中具有m比特的大小。第一个孩子节点的活动位数是m’ =rank1(T, p'+ m)- rank(T, p')。注意因子| Z | ×k2跳过第一级节点。

         ik2树中的查询可以分为查询在Z分量中检索具有固定值的元组的查询,以及查询在Z分量中的范围值内检索元组。该结构只需要通过检查每个节点的特定位来遍历树。例如,要检索值为zi的所有单元格,我们从根的k2个子节点开始。在每个孩子节点,我们验证zi bit是否活动。 如果它是活动的,我们使用秩操作向下遍历树直到叶节点。如果该位不活动,则意味着当前子矩阵对于zi为空。在Z组件中检索范围值的查询需要更多的工作,因为我们需要检查查询中涉及的所有节点。这个想法是通过修复第三个组件的值来执行许多查询。例如,如果我们要恢复Z值在zi和zi + w之间的所有元组,我们需要对值zi,zi + 1,,,,zi + w.执行固定查询。

        ik2-tree使用的空间对应于| Z |的组合空间 不同的k2树。为了减少空间和导航时间,我们可以直接应用为k2-tree设计的所有增强功能。ik2树已被应用于RDF三元组和时间图[24,25]。 在某些情况下,像进化光栅数据,kd-tree在空间和时间上优于ik2-tree [18]。


2.4 k2-trees for temporal graphs

        在k2树中存储时间图的第一种方法是差分k2树[17]。它基于对一些时刻的时间图的状态进行采样,并且存储图的相对于最后采样的当前快照(即,活动边的集合)之间的不同。差异由当前时间相对于最后一个快照瞬间改变的边(活动或非活动)组成。采样和差异都使用k2-tree表示。如果边仅出现在采样中或仅出现在存储在tk的差分k2树中,则边缘在时间tk处是活动的;否者,该边在时刻tk是停用的。这种表示的主要问题是差异在连续的时刻趋于相似; 因此,它们存储多次边的状态改变。

        由于时间图是随时间演进的二进制关系,因此它们可以表示为形式(u,v,tk)的三元组,其中tk表示边(u,v)被激活或停用的时刻。实际上,图(u,v,ti,tj)的每个连接产生两个三元组(u,v,ti)和(u,v,tj),分别对应于边(u,v)被激活和停用的时间点。Álvarez[18,24,25]使用这种3D编码来存储使用交织k2树的时间图。 三元组由时间分量索引。通过使用ik2树,如果存在奇数三元组(u,v,tm),其中t∈[0,tk],则时间tk处边(u,v)的状态是活动的。直接和反向邻居和快照查询的检索以相同的方式工作,通过计算与每个邻居相关三元组的个数。这种表示非常紧凑,因为状态变化只存储一次。然而,它需要计数每个相邻的改变以恢复边的状态,这在具有许多连接的边代价比较高。

          在下面的章节中,我们将展示如何处理使用kd-tree时空间指数增长以及如何处理由于d维空间引起的稀疏。 



The Compressed kd-tree (ckd-tree)

       表示时间图的简单方法是使用k4-树,其中接触是四维二进制矩阵中的单元,具有两维编码边缘,而其他两个编码时间间隔。这个简单的表示有称为维度的诅[40]的问题,这表明当维度数量增加时,可用数据变得稀疏。

            k4树具有16比特的节点(对于k = 2),因为存在其中4D点可以落在每个递归空间分区中的16个子矩阵(即,空间在维度数量上呈指数增长)。当k4-树表示时间图时,时间约束强加单元编码值ts>=te将永远不被使用,并且因此,存储在相同叶节点中的连接数的最大数量等于4。因此,表示联系的4D点变得非常稀疏,产生许多一元路径,其中内部节点倾向于具有存储单个单元的叶节点。因此,用于表示时间图的k4树的直接使用不像用于静态图的k2树那样压缩,因为由k2树使用的自相似机制(在路径上)不能被复制用于时间图 。

         在不考虑任何种类的规律性(即,自相似性)的情况下,表示4D矩阵所需的比特数的信息理论下界是具有m个活动单元的大小为n4的可能矩阵的数量的对数。我们称熵为这个值,它由  表示。 使用斯特林的近似,可以得到(见[36]中的引理8和[11]中的2.1节):

表示二进制矩阵(对于k = 2)的k4树需要 比特,其渐近地是熵H的四倍

          如何才能实现更多的压缩考虑到四维空间的稀疏性?我们在本文中提出kd-树的变体,其能够使用“熵”H空间来压缩表示一个接触(1个单元)的叶子上的一元路径。我们的建议背后的想法是当找到仅具有一个单元(接触)的子矩阵时停止d维二进制矩阵的分解。这在kd树中产生三种类型的节点:表示空子矩阵的白叶节点,表示仅具有一个单元(仅表示一个联系人)的子矩阵的黑叶节点和表示具有多个1个单元的子矩阵的灰色内部节点(许多接触 )。黑叶节点中的分离的细胞作为相对于其子矩阵的相对位置存储在分离的阵列中。

        不同于k2树(和kd树),其中整个树本身编码活动单元,我们方便地选择哪些部分的根到叶路径在树中编码(作为灰色节点),哪一部分 编码在树外(黑叶中的孤立细胞)。

        在概念上,所提出的策略类似于点区域(PR)四叉树的概念[40,pp。42-46]。与PR Quadtree的主要区别在于,我们通过在树的简洁表示上将活动单元编码为根到叶路径来减少整个数据结构所使用的总空间,其中指针被位图替换。树的简洁表示遵循对于基数树的广义Jacobson水平顺序[7,30]编码。我们扩展这种表示方式,每个节点只使用一个额外的位来编码每种类型的节点(白色,黑色和灰色)。我们还利用水平顺序编码来在恒定时间内检索黑叶的路径。

        由于ckd树依赖于kd树,所以可以使用对原始操作的小修改来遍历树,直到找到黑色节点或者达到固定深度。

        

3.1 Encoding the tree


         压缩kd树的第一步是开发一种编码树中三种节点的策略:白色,黑色和灰色节点。当对应子矩阵具有分别对应于黑色叶节点或灰色叶节点的一个或多个单元时,T中的位为1,并且如在原始kd树中具有用于空子矩阵(白色叶)的0。为了区分1位是否属于黑叶或灰色节点,我们创建第二个位图B,为T中的每个1存储一个位。黑色叶标记为1,白色灰色节点标记为0.注意,B的大小是T中的1的数字。这种编码方案是基于de Bernardo等人开发的工作。 [16]来压缩k2树中的满足1的子矩阵。

        必须更新新kd树上的导航机制以考虑黑色和灰色节点的B中的新编码。现在,T中位置p处的内部节点的第一个孩子节点将在位置,因为我们需要减去编码黑叶节点T中的1位的数目直到当前位置p,因为它们不产生新的子节点。如果T中的位置p被设置为1,则B [rank 1(T,p)]可以取两个值:如果p对应于黑叶则为1,或者如果p对应于灰色内部节点则为0。


3.2  Encoding isolated cells in black leaves

 

        孤立单元(即,黑叶)的一元路径被表示为单元相对于其相应子矩阵的左上角的相对位置。如果左上角位于矩阵的位置(u1,u2,...,ud),则孤立的单元(p1,p2,...,pd)被存储为(p1-u1,p2-u2 ,...,pd -ud)。例如,图1中的单元(9,1) 在图5中被存储为(1,1),因为其子矩阵的左上角在位置(8,0)处开始。单元的相对位置以级别顺序存储到维数阵列A中,因为树叶节点中出现黑叶节点。每个条目对应于ckd树中的一个黑叶节点。 位置p处的黑叶节点的一元路径存储在位置A [rank(B,rank 1(T,p))]处。图5示出了图2中的k2树的压缩版本。

          注意,在树的最后一级的黑叶节点不需要存储相对于其子矩阵的相对位置。这是因为在最后一级,子矩阵具有kd的大小,并且相对位置已经由T中的1位的位置编码。因此,位图B和数组A没有用于出现在ckd树的最后一级的黑叶的条目。

           可以使用每个黑叶节点的d×log(n / k)比特来存储一元路径,其中n / k对应于可以存储在树中的最大子矩阵的大小。但是这个选项是幼稚的,因为子矩阵的大小取决于黑叶节点出现的层。另一种替代方法是使用可变长度编码,例如DAC [9],但不能保证空间将是隔离单元的均匀分布所需的最小值。因为黑叶节点的深度指示子矩阵的大小,并且因此指示孤立单元的最大相对位置,所以可以通过将A划分为A1个不同的数组来减少空间,高度h = logkd nd。然后,级别1的黑叶节点使用d×log(n / k1 + 1)比特。 这保证了相对于kd树的空间的改进。在kd-树中,隔离的单元是使用总共kd×log(n / kl + 1)位存储为最后一级中的叶的一元路径。

          A的分区需要知道我们访问的节点的级别。为了简化这一点,我们还将位图T和B按级别划分,并且相应地更新树的导航。在l层位置p处的内部节点的第一个孩子在位置

  另一方面,为了检查级别1的p是否是黑叶或灰色内部节点,我们验证Bl [rank 1(Tl,p)]是否为1(或分别为0)。在位置P1处的黑色节点的一元路径位于位置A1 [rank 1(B1,rank 1(T1,p))]。


3.3 Space analysis

          假设大小为nd的d维二进制矩阵,存储均匀分布的m个单元。每个单元在二进制矩阵中是1,并且在最坏的情况下,这需要存储用于树的每个级别的节点,需要总共 h = logkd nd 节点。由于每个内部灰度节点需要在位图T中存储kd个比特,在B中存储另一个kd个比特,因此这会导致总空间为  位。然而,不是所有的节点在树的上层可以不同。在最坏的情况下,所有节点存在到级别 h' = log kd m (该级别包含m个不同的节点)。从该层,最坏的情况是到树叶的m个路径中的每一个是唯一的,因此,它们被存储为黑叶节点。在这个级别的每个黑叶节点存储一个单元作为相对于尺寸为nd /(kd)的子矩阵的偏移量。这个偏移实际上是到传统kd树的叶的路径。 存储黑色叶中的单元的所有偏移的总空间是m log(nd / m)位。 因此,在最坏的情况下,总位空间为:

如在kd树中,公式表明较小的k将实现较少的空间。 它也依赖于维数的指数,但只在它们的一个术语中。对于k = 2和d = 4,空间是 位,其是渐近地表示具有m 1s(即,m个接触)的大小为n4的所有二进制矩阵所需的信息理论最小空间(等式1)。

 

3.4 Construction

ckd树的构造算法基于k2-tree和kd-tree的位置构建算法[10,p 158] [18]。它基于对树中每个子矩阵都有效的单元的迭代选择。有了这个策略,我们可以从左到右构建位图T和B,以及数组A。我们假设输入二进制矩阵表示为具有形式(p1,p2,...,pd)的m个点的阵列P [1,m],其中pi指示每个维度中的单元的位置。请注意,树的最大深度为h = logkd nd = logk n。 因此,在构造算法开始时,存在h个可用的空位图T1和B1以及h个阵列A1。 回想一下,A1是一个d维数组,每个条目保持d×log n / kl + 1位。

 

        该算法通过维持要解析的子问题的队列来工作,其中每个子问题对应于树中的子矩阵和节点。子问题由子矩阵的大小,当前节点的树中的级别l和数组p的间隔[a,b]组成。其包含落入子矩阵中的点。 初始步骤是使表示根级节点的子问题在级别l = 0和表示大小为n的整个矩阵的间隔[1,m]入列。以下步骤基于设置T和B中的位并入队新的子问题,一个用于节点的每个子节点。当间隔[a,b]只包含一个单元格时,我们标记位图B,并设置数组A编码相应的一元路径。

     对于每个子问题,我们生成atmos kd新的子问题,每个子问题对应于级别 l+1的子节点的子矩阵。 对于大小为n的子矩阵,具有间隔[a,b]的级别l的子问题被处理如下。  我们将区间[a,b]细分为kd个子区间,并为[a,b]中的每个点分配一个关键字i,0≤i<kd。 键由下式子定义:

 其中分母n / k是子节点的子矩阵的大小。

        如在k2树中,我们通过使用计数排序的密钥对间隔进行排序,生成[a,b]的kd子间隔[ai,bi]。然后,如果ai <bi,则将位图附加一位1,否则附加一位0。对于T1中的每个1,如果间隔的大小是bi-ai = 1(即,它是黑叶),则在位图B1中附加1,否则为0。对于B1中的每个1,我们在P [ai]中追加该点的路径的编码。p = P [ai]的一元路径被计算为单元相对于当前子矩阵的相对位置为(p0 mod n / k,p1 mod n / k,...,pd mod n / k)。对于B1(非黑叶)中的每个0,我们使用具有在级别 l + 1的n / k的子矩阵大小的间隔[ai,bi]来排队一个新的子问题。参见图6为完整的算法。

        在最坏的情况下,当矩阵充满1时,在队列中保持最多m个项目所需的构造大小。在平均情况下,假设m个单元的均匀分布,构造时间是O(m log m),因为对于树的每个级别,我们需要每个间隔的计数排序。

3.5 Orthogonal range search

        ckd-tree中的范围搜索算法类似于PR四叉树中的范围搜索算法,遍历所有子矩阵与要检索的区域相交的子节点。该区域也由两个极端单元定义,即左上和右下单元。由于我们没有明确存储子矩阵的边界(左上和右下单元格),我们在向下遍历树时计算它们。

        搜索工作如下。 我们从表示整个矩阵的根节点开始,这是(0,0,...,0)处的左上单元和(n,n,...,n)处的右下单元之间的区域 )。然后,我们递归遍历所有的kd孩子遵循在最后一节定义的排名操作。令(u1,u2,...,ud)是大小为n的子矩阵的左上单元。第i个子子矩阵的左上单元的第j个分量由u‘j定义

U'j = 右下单元格由下式定义。如果子矩阵的边界不与区域相交,或者如果当前节点是黑色叶,则我们停止递归。在我们到达树的最后一级的情况下,我们返回(u0,u1,...,ud),因为左上单元对应于1d子矩阵,即,单元。

        图7示出了用于检索区域R中的活动小区的正交范围搜索的算法。该算法被调用参数范围(l,n,u,z = 0,R),其中l是要遍历的树的级别,n是当前子矩阵的大小,u是d 子矩阵的左上单元格,z是当前节点在T1中的位置,R是查询区域。由于根节点在树的位图编码中是虚拟的,我们设置l = -1以表示根节点的级别,u是(0,0,...,0)∈nd,并且z = 0。

        注意,通过使用范围搜索,可以以类似于k2-tree对静态图的方式计算时间图上的操作。下一节显示如何获得这些范围,并给出获得一些操作所需的时间成本的上限。
 
  4 Using the Compressed k d -tree for representing temporal graphs

        正如我们在上一节开始时所说的,时间图的接触可以由4D二进制矩阵中的单元表示,用于表示边缘的两个维度和用于表示边缘有效时的时间间隔的两个维度。因此,4D二元矩阵中的时间图G =(V,E,T,C)的熵可以表示为:

 
  其中c = | C | 是接触(4D单元)的数量,n = | V | 是顶点的数量,并且(τ(τ-1))/2是大小为τ= | T |的寿命中的不同时间间隔的最大数量。

        该表示的细化取决于时间图的类型。例如,我们知道,在点接触中,所有接触仅持续一个时刻,因此,它们可以被表示为3D单元,其中时间间隔由边缘有效的时间点代替。以相同的方式,增量(递减)时间图可以由3D单元表示,因为我们知道时间间隔在寿命结束时(或在寿命的开始处开始)结束。在这种情况下,第三维度存储开始(或结束)的时间点。

        在本节中,我们通过在矩阵上执行范围搜索来展示如何获取活动邻居。这是k2树用于检索直接和反向邻居的相同机制。


4.1 Operations as range searches


         因为我们在4D二进制矩阵中存储联系人,我们可以通过进行正交范围搜索来计算时间图的邻接操作。实际上,这是用于在静态图中计算直接(反向)邻居的k2树的后继(前趋)算法背后的理论。 在这种情况下,它们恢复行(列)中的活动单元格。

            对于间隔接触时间图,想法是恢复4D区域内的活动细胞。例如,为了在时间点t获得顶点u的活动直接邻居,即DirectNeighbors(u,t),我们需要恢复联系人(u,·,ts,te),其中第二分量是无界的,并且 所述时间约束使得ts≤t<ts。该时间约束可以转换成第三和第四分量上的范围,使得ts∈[0,t]和te∈(t,τ)。该范围定义单元(u,0,0,t + 1)和(u + 1,n,t + 1,τ)之间的区域。 观察到我们正在固定第一个组件,第二个组件在第二个维度(表示目标顶点)中表示为一个整个范围[0,n)。

          相同的想法可以扩展到恢复点接触时间图的直接邻居。在这种情况下,我们将形式(u,v,t,t + 1)的接触转换成形式(u,v,t)的3D单元格。   然后,DirectNeighbors(u,t)只需要恢复范围(u,0,t)和(u +1,n,t +1)中的单元格,因为我们知道联系人只有一个时间点。   对于具有接触(u,v,t,τ)的增量时间图,其中τ是图的寿命,接触也可以存储为3D单元格。在这种情况下,单元格是(u,v,t)的形式。 由于我们知道所有的联系人在最后的时间点结束,直接邻居可以通过范围(u,0,0)和(u + 1,n,t + 1)恢复。递减时间图的操作可以以相同的方式导出。

             对顶点和边的间隔查询需要管理弱和强语义。 弱语义检索在[t,t]上与间隔查询重叠的所有联系人,这是所有联系人,使得[ts,te)∩[t,t‘)=∅。 约束等效于恢复触点,使得t≤te和t s≤to。 这些不等式分别定义了第三和第四分量对应的范围,分别为ts∈[0,t)和te∈(t,τ)。然后,可以通过检索区域(u,0,0,t + 1)和(u + 1,n,t,τ)内的单元来计算间隔上的弱DirectNeighbors操作。

              由于弱语义相对于查询间隔检索重叠的联系人,所以在输出中可能存在重复的边缘。我们通过添加额外的步骤来删除这些重复的项目,对每个边缘的目标顶点进行排序。  这个额外的步骤在CAS和CET [12]中不是必需的,因为它们已经返回非重复的边。

               强语义在[t,t)期间检索所有活动联系人,这是,它检索所有联系人,使得[t,t]⊆[ts,te]。 因此,第三和第四分量的范围分别是ts∈[0,t)和te∈[t ’,τ)。   通过检索区域(u,0,0,t 1)和(u + 1,n,t + 1,τ)内的单元来计算强直接相邻操作。

            通过检索在间隔[t,τ)上的边缘操作的输出中找到的第一接触,考虑弱语义来计算EdgeNext操作。由于弱语义中的间隔包含在时间t(直到寿命结束)处有效的边的接触,输出中的第一接触是下一个边缘的激活。

            表3示出了定义用于间隔接触,点接触和增量时间图的计算操作的边界的左上和右下单元。通过将无界范围更新为第一个组件,可以将ReverseNeighbors操作计算为DirectNeighbors操作。可以通过将时间约束更新为第四分量来计算DeactivatedEdges操作。


4.2 Time analysis

        计算时间图上的操作的时间取决于在搜索范围中固定多少个组件。用于恢复直接邻居(或反向邻居)的搜索范围固定一个分量。因此,最坏情况的情况是遍历每个节点的k3个子矩阵,直到叶,其中单元格具有形式(u-1,...,·)。Aswe在空间分析中报告了。 3.3,均匀分布在4D矩阵中的m 1s的树的深度为h = log k4 c。因此,在最坏的情况下,这给出了(k3)h∈O(c(3 / 4))的上限。这确实不是理想的O(m / n)(对于任何时间点的平均活动邻居,m是边的数目),但是它比检查O(c)中的所有活动单元的状态更好。

        因为边缘操作修复了范围搜索(源和目标顶点)中的两个分量,所以它的上限是(k2)h∈O(√c)。由于快照查询不修复任何组件,其上限为(k4)h∈O(c)。注意,因为接触满足时间间隔(第三和第四分量)的时间约束,所以平均性能确实优于均匀分布的时间。在时刻检索事件的操作修复每个联系人的第三或第四个组件。 因此,其上限时间为O(m(3 / 4))。

        3D表示可以遵循相同的分析。由于增量时间图确定了DirectNeighbors(ReverseNeighbors)操作的一个分量,因此,最小值上限为(k2)h∈O(c2 / 3)。边缘运算修正两个分量,给出kh∈O(c1 / 3)。快照操作仍然为O(c)。点接触时间图的操作遍历每个节点较少的矩阵。DirectNeighbors(ReverseNeighbors)操作修复了两个组件,并在(k)h∈O(c1 / 3)中运行。边缘操作只向下遍历一个子矩阵,这在O(logk3 c)中完成。快照操作在(k2)h∈O(c2 / 3)中计算,因为它固定时间分量。关于事件的操作也在O(c2 / 3)中计算,因为它们仅固定每个三元组的时间分量。


4.3 Hybrid representation of interval-contact graphs

        在实时时间图(例如Web)中,页面之间的大部分链接在很长一段时间内保持活动,而另一些则没有。例如,考虑一个报纸网站,其在其主页中显示链接到不同部分(例如,运动和政治)的菜单,以及指向一天的文章的主体。我们可以看到,主页共享菜单的增量图的属性,因为链接长时间保持活动,并且它共享主体的间隔连接图的属性,其不断地更新。我们在这里建议通过将时间图的连接分成由4D和3D元组表示的两组连接来考虑这种类型的情况。以这种方式,我们利用在增量或点连接图之后连接的3D表示的空间减少。

       分区通过将联系人分成三个组来工作,这三个组满足增量,点连接或间隔连接图的属性。如果连接在生命期图的结尾处结束,则它属于增量类,并且如果联系的持续时间是时间点,则它属于点联系类,这两个连接被存储为3D元组。否则,连接属于区间联系类,并且存储为4D元组。为了解决时间图操作,有必要对4D和3D表示执行范围搜索,并组合解决方案。除了间隔操作组合步骤是直接的。使用弱语义,我们需要删除重复的边,而使用强语义,我们需要删除出现两次或更多次的边。此步骤是确保强语义约束所必需的。虽然这可能表明在最坏的情况下操作需要原始结构的时间的两倍(因为我们对两个数据结构执行范围搜索),在实践中它的效果非常好,我们将在实验部分中显示。注意,这种改进仅在大部分的连接属于增量或点接触类时才有效。


5 Improving the Compressed kd-tree

        在本节中,我们提供两种技术来提高ckd-tree的性能。第一个,称为节点压缩,压缩具有多个叶节点但具有很少直接子节点的节点。这是通过将一半维度编码为新父节点,将另一半维度编码为父节点的子节点。第二种策略,称为黑叶桶,通过将黑叶分成固定大小的桶来改善时间。虽然第2.3.1节中所看到的k2树的改进技术是明智的,但我们必须记住,它们只是由于Web(静态)图和栅格数据中的特定特性才起作用。


5.1 Node compression/dimensional partition

        由于d维中的数据的非均匀分布,kd树的大多数节点往往具有很少的孩子节点。例如,在表示四维矩阵(k = 2)的k4树中,节点由16位表示,即使它们只有一个子节点。因此,位图T中的大多数节点存储许多0。 我们的建议是通过减少内部节点(使用较少位表示稀疏矩阵)的精度,减少kd-树的空间。这可以通过分解kd树中的孩子必须表示kd多维子矩阵中的一个并且通过允许内部(灰色)节点以较少维度表示子矩阵的假设来完成。以这种方式,由使用kd个比特的内部节点表示的子矩阵可以由具有最多kd/ 2的新节点重新定义。 孩子节点他们每个使用kd / 2位。该父节点以[d/2]维表示k[d/2]子矩阵。子节点表示在剩余的d/2 维中表示kd/2 子矩阵。这允许在具有很少孩子的节点中的空间减少,因为需要较少的比特来表示空子矩阵。

        为了压缩内部节点v,我们需要将其二进制表示分成kd /2 块。我们创建一个新节点vp,kd/2 儿童。 如果v的第j个块非空(它至少有一个子节点),我们设置vp的第j个子节点指向第j个块。因此,如果许多块是空的,则可以减小空间。例如,k = 2且仅有一个子节点的k4树中的节点可以被转换为具有子节点的新的父节点,两者都使用k2位。这使我们可以减少高达原始节点的50%的空间。 在3D矩阵中,空间可以减少高达75%,因为使用8位的节点可以被转换为 4位的父节点(以存储前两个维度的信息)和子节点 2位存储最后一个维度。由于用于在T1位图中表示树的级别顺序,该节点压缩策略仅在kd-树的整个级别的节点中工作。图8显示了具有一个子节点的稀疏内部节点的压缩版本。

        树导航算法必须相应地更新以便知道用于划分每个子矩阵的维度的划分。

        当节点稀疏时,也有时间上的改进,因为更少的比特被遍历以检查哪个指向一个孩子。例如,考虑一个4D空间中的一个节点,只有一个孩子(图8)。在传统的表示(图8a)中,节点使用16位,因此,我们需要检查16位中的每一位以查看其子节点中的哪一个存在。相比之下,当使用节点压缩(图8b)时,我们只需要检查8位来找到哪一个是活动子节点。因此,节点压缩不仅减少了空间,而且也减少了遍历时间,因为树具有较少的节点。

       具有两个以上维度的非均匀矩阵得到最佳结果。这是因为在k = 2的二维中,一个节点将使用4位,这是父节点与子节点的完全相同的空间,每个节点使用2位。因此,对于d = 2不期望空间或时间增益。

        当数据均匀分布(即,最坏情况情况)时,节点压缩技术增加了数据结构的空间。这是因为每个内部节点都有其所有的kd子节点。因此,内部节点将需要kd + kd / 2位,因为将使用节点压缩中的所有块。这也将树的预期高度增加到没有节点压缩的ckd-tree高度的两倍,因为logk(d/2) m = 2h‘。因此,在这种情况下,位图T和B所需的空间和遍历树的时间将增加。然而,在实践中,时间图是不均匀的。在实验部分,我们将显示使用这种技术的4D表示中的空间和时间都得到改善。

5.2 Bucket black-leaves

        如Samet在[40,p45]中所声称的,当数据被聚类(即,不均匀)时,PR四叉树可以包含许多空节点。因此,树变得不平衡,这也发生在ckd树中。为了克服这种不平衡,Samet将叶聚集成桶,提出桶PR四叉树。每个桶可以存储b个单元,其中b是桶容量[34]。我们遵循Samet提出的相同策略,并定义了桶ckd树(bckd-tree)其黑色叶至多编码b个单元。这种方法的主要目标是加快检索稀疏子矩阵中的数据时间,其中单元的分布不均匀。该结构需要通过停止递归分解来修改位图T1和B1的构造,直到我们在当前子矩阵中找到b个或更少的单元。还使用相对于子矩阵的偏移以水平顺序(从左到右)将单元存储在阵列A1中。

        因为存储桶可以存储b个或更少的单元,所以我们需要指出每个存储桶中存储了多少个单元。我们创建一个新的位图C1,每个级别一个,在一元编码中存储每个黑叶中的桶的大小。如果当前子矩阵具有k≤b个单元,则在C1中1位附加k-1个零。这是从左到右,对于在级别 l和所有级别发现的所有黑色叶节点。在T1中的位置p处的黑叶的第一个细胞在位置p' = select1(C1,rank1(B1,rank1(T1,p))),最后一个位于位置p“= select1(C1,1 + rank1(B1,rank1(T1,p)))。位图C1的总长度为m,因为每个单元用1(如果桶仅保存一个单元)编码,否则以0编码。图9示出了图5中的ckd树的bckd树。

          图9 ckd-tree的桶版本。黑叶编码至多2个单元(桶尺寸b = 2)。两个圆圈标记被合并到桶中的黑        叶节点。


        我们期望 通过将节点分组到桶中减少检索时间,因为树的平均深度随着桶的大小而减小。在均匀矩阵中,树的预期深度为h” = logkd(m / b),因为每个黑叶节点将最多保持b个单元。这引起空间 - 时间折衷,因为对于较短的树,在位图Tl和Bl中使用较少的空间,但是在阵列A1中需要更多的空间,并且在Cl位图中使用额外的m位。A1中的空间增加,因为它取决于黑色叶节点的级别l。随着更多的条目将被存储在树的第一级中,将使用更多的空间(即,空间随b增加)。关于时间性能,一旦我们发现一个黑叶节点,我们需要检查桶中的每一个条目以找到一个单元格。在实验部分,我们将评估使用三种不同桶尺寸的折衷。


6 Experimental evaluation

       在本节中,我们使用ckd-tree和bckd-tree对kd-树和ik2-树来评估代表性时间图的性能,这被认为是比较的基线。kd-tree使用在第4节中描述的4D和3D元组来表示图。对于ik2树,我们生成相应的三元关系,表示每个联系人的邻近变化。我们还评估其他压缩时序图表的性能,如CAS,CET,EveLog,EdgeLog和TGCSA。


6.1 Experimental framework

         我们在真实和合成时间图上运行了几个实验。表4给出了这些图的主要特征:名称,类型,顶点数,边和触点数,寿命长度,每边的触点数,简单EdgeLog表示的空间(4字节和8字节整数 指针),以及在第3节中定义的熵H的空间。

        Comm.Net是一个模拟随机顶点之间的短通信的合成数据集。Powerlaw数据集也是合成的; 它模拟幂律度图,其中很少的顶点具有比其他顶点多得多的连接,但寿命短。Flickr-Day和Flickr-Sec数据集是增量时间图,用户在Flickr社交网络中成为朋友的时间将被编码。Flickr-Day [14]数据集使用一天的粒度,使用寿命为134天,从2006-11-02到2007-05-18.。Flickr-Second数据集从社交网络的创建开始捕获具有两天的友谊关系的创建。TheWiki-Links数据集由维基百科的英文版文章之间的历史链接组成。它有一个时间粒度第二。 它对应于2014-03-04维基百科的历史转储。Wiki-Edit [32]是一个点接触时间图,指示用户编辑维基百科文章的时间。自创建维基百科以来,时间以秒为单位存储。雅虎Netflow数据集包含互联网最终用户和Yahoo服务器之间的通信记录[42]。最后,Yahoo-Session数据集是一个点接触时间图。它包含用户在Yahoo!搜索引擎中搜索一组查询字词的时间。

        编码时间图的二进制矩阵的维数取决于数据集的动态属性。我们使用4D矩阵描述间隔(I)时间图的和将3D矩阵用于增量(G)和点接触(P)图。

        在查询级别测量时间性能(即,测量运行相邻操作所花费的时间)。我们按照第一部分建议的操作类别对评估进行划分。 2.1(即,通过关于边沿,顶点,图形的状态和沿着时间的事件的操作)。对于每个操作类,我们运行它的时间瞬间和时间间隔,考虑弱和强语义。根据操作类型,我们评估每个查询的平均时间或每个输出触点的平均时间(即,直接/反向邻居或活动边沿),在每个操作类的部分中解释细节。

        实验在一台机器上运行,该机器有两个四核处理器Intel Xeon CPU E5620@2.4 Ghz和64GB DDR3 RAM在1067MHz。操作系统是Ubuntu GNU / Linux 12.04,编译器是GCC 4.8.3带-O3编译优化。我们使用Succinct数据结构库9(sdsl-lite)[26]来创建kd-tree,ckd-tree和bckd-tree中的位图,以及紧凑数据结构库10(libcds)[15] 数组在ckd-tree和bckd-tree。对于k2树和ik2树,我们使用其作者提供的实现。

        对于ckd树,bckd树,kd树和ik2树,使用k = 2进行所有实验。

6.2 Influence of node compression and bucket size

            

     在比较空间和时间与基线之前,我们报告节点压缩和桶的大小如何影响使用3D和4D矩阵的时间图的表示。 我们评估了ckd-tree和bckd-tree对于I-Wiki-Links和P-Wiki-Edit图的七种不同配置:WC是纯文本,没有节点压缩;  HC和FC分别对树的半级和全级使用节点压缩;B16和B64使用桶大小为16和64个单元,分别为12,没有节点压缩; 并且B16 FC和B64 FC分别使用具有完全节点压缩的桶大小16和64。我们考虑了树和黑叶节点(位图T1和B1)的空间使用,孤立单元(数组A)的编码以及存储每个黑叶节点(位图C1)的桶大小的空间。ckd-tree和bckd-tree中的所有位图使用sdsl-lite的交织位向量,块大小为1024位。我们还在这里报告检索直接邻居的时间,以ms为单位输出联系人。

        图10显示了在3D和4D矩阵中使用节点压缩和黑叶桶的好处。比较WC和HC和FC,我们可以观察到,当更多级别的树使用节点压缩时,有效地减少空间。这是由于在3D和4D矩阵中位图T的收缩。在4D矩阵中,空间的改进也产生时间的改善,当树的所有级别使用节点压缩时实现最佳结果。相反,3D矩阵中空间的减少是以增加检索时间为代价的。比较B16和B64配置,我们观察到增加一点空间,但相对于WC,HC和FC变体的时间的重要改进。在4D矩阵中,检索时间比FC配置提高3.7倍,而WC变化提高1.5倍。改进与桶大小直接相关,使用更大的块大小具有更好的时间。

        当我们将桶变体与节点压缩(B16 FC和B64 FC)组合时,我们不会获得节点压缩的空间减少。这是因为当使用B16和B64配置时,位图T已经很小。然而,在4D矩阵中,我们继承了由于节点压缩而导致的检索时间的改进。以相同的方式,我们继承3D矩阵的检索时间的增加。

        总之,当使用ckd-tree时,节点压缩技术(第5.1节)在间接接触时间图(4D矩阵)中比在点接触和增量图(3D矩阵)中工作更好。 如果桶大小为2,则此结果也适用于bckd-tree。当桶大小大于16时,节点压缩无法按预期工作,因为位图T已经编译了一个小树。

        现在我们比较我们的建议基线kd-tree和ckd-tree和bckd-tree。图11显示了在I-Wiki-Links?和P-Wiki-Edit图表上使用RRR压缩位图[38]的kd-树的空间,其中块大小为15,63和255位。如所期望的,当RRR位图的块大小增加时,kd树的空间减小,但这是作为增加检索时间的费用。使用63位的块大小,kd-tree获得其最佳配置。 在这种情况下,ckd-tree和bckd-tree使用0.7倍的空间,并且比kd-tree快几倍。


6.3 Space evaluation

        我们现在将我们提出的方法与其他结构进行比较。 通过将结构的总空间除以图中的接触数量,以每触点的位数(bpc)来测量空间。表5使用节点压缩和将叶子分组成桶(bckd-tree)来比较ik2-树,原始kd-树和熵H与我们的ckd-树。我们还包括Snapshot k2-tree(表示为Snap.k2-tree)的空间,其存储每个时刻的活动边缘的k2树,基于压缩后缀数组[5]的TGCSA, 基于序列的CAS和CET,以及基于事件和邻接表的EdgeLog和EveLog结构[12]。


        在本实验中,以及以下部分,我们报告每个图表的最佳配置。表5中的前两列对应于我们的结构的空间,即ckd-tree和bckd-tree。对于这两种结构,我们使用未压缩的位图,每1024位采样一次。我们使用FC变体用于I-Comm.Net,I-Powerlaw,I-Wiki-Links和IYahoo-Netflow,P-Yahoo-Sessions的HC变体和G-Flickr-Days,G-Flickr- Secs和P-Wiki-Edit。对于bckd树,我们报告所有数据集的桶大小B16,没有节点压缩(WC变体)。

        第三列表示基线使用的空间,kd树使用块大小为63位的RRR压缩位图。第四列对应于ik2-tree的空间。第五列是Snapshot k2-tree使用的空间,如果我们将图形存储为几个静态图形(快照),每个图形包含生命周期中每个时刻的活动边缘。ik2树和快照k2树使用未压缩位图,每640位采样(即使用5%的额外空间)。在某些情况下,ik2-tree和Snapshot k2-tree结构的创建失败,并用破折号标记。

        以下四列对应于结构CAS和CET,使用块大小为15位的RRR压缩位图的libcds实现,以及使用PForDelta整数压缩器[43,44]的EveLog和EdgeLog,块大小为128 元素和32个元素。最后一列是TGCSA使用的空间,使用Ψ阵列上的每个64项的采样大小。

        我们可以看到,我们的建议ckd-tree和bckd-tree在一半的图形中获得更好的空间,并且它们总是比熵H更好。压缩比平均为kd树的74%,比快照k2树好几倍。k-tree在P-Yahoo-Session图中具有比ckd-tree更好的空间; 然而,我们的bckd树获得更好的空间。当ik2-tree实现比ckd-tree更好的空间的唯一情况是在G-Flickr-Days中,因为G-Flickr-Days具有134个瞬时的短寿命,这是ik2-tree的最佳情况。

        关于基于序列的结构,CET在P-Wiki-Edit中获得最佳空间,而CAS在I-Wiki-Links和G-Flickr-Days中获得,压缩比为91,68和82% 分别由ckd-tree使用的空间。由于I-Wiki-Links和G-Flickr-Days有越来越多的活动边缘,因此CET和CAS不需要存储在生命周期结束时停用边缘的邻近变化[12]。此外,由于P-Wiki-Edit是点接触时间图,所以结构不需要存储停用边缘的相邻改变,因为根据定义,所有联系人具有一个时间点的持续时间。注意,正如[12]中所报道的,CAS和EveLog报告反向邻居的速度很慢,这在我们的建议中不是问题。

        EdgeLog,EveLog和TGCSA使用的空间总是大于熵H,无论图的类型如何。唯一的例外是TGCSA上的P-Wiki-Edit图,它使用90%的熵空间。然而,我们将在时间评估中显示,这些结构对于回答大多数操作是非常快的。

6.4 Time evaluation

本节介绍在Sect中定义的操作分类后的时间评估。 2.1。每个小节包括对时刻和时间间隔的评估在弱和强语义下。我们还包括一个小节来评估ckd-tree对于间隔接触图的混合表示。此外,我们报告敏感分析,以检查如何每个边缘和每个顶点的联系人的数量影响所有结构的时间评估。


6.4.1 Active edge retrieval and next activation

        在本节中,我们研究检查边缘在时间点和时间间隔期间是否有效的效率以及获得下一个边缘激活的时间瞬间的效率(EdgeNext操作)。在本实验和以下部分中,我们选择了6.3中报告的数据结构的变体。我们还为bckd树和kd-tree的RRR位图的三个块大小(15,63和255)添加了三个不同的桶大小(即,2,16和64)。

        对于这个实验,我们通过从图中随机选择2000个联系人来生成2000个查询。对于每个选定的联系人(u,v,ta,tb),我们使用源和目标顶点(u,v)和时间间隔ta的开始执行边缘和边缘下一步操作。时间性能以报告的每个触点的μs测量,并且空间以每触点的位数(bpc)测量。

        图12和图13显示了使用每个图的最佳配置的Edge和EdgeNext操作的性能。我们选择图形I-Powerlaw,I-Wiki-Links,I-Yahoo-Netflow,G-Flickr-Days,G-Flickr-Secs和P-Wiki-Edit作为代表性数据集,因为它们恢复所有结构的性能。通常,Edge和EdgeNext的时间性能对于所有结构是相似的。即使在最慢的配置中,ckd-tree和bckd-tree比原始kd-tree基线更快。桶大小的作用如预期地工作,随着桶的大小增加,减少恢复边缘的状态的时间。ik2-tree对于我们能够创建的数据集具有最好的性能。 ik2-tree的最佳情况是G-Flickr-Days图,比我们的ckd-tree快65%。基于序列的方法CET和CAS在具有长寿命(G-Flickr-Secs和I-Wiki-Links)的活动边缘数量增加的图中具有良好的性能。这也发生与TGCSA,虽然对空间的重罚。 在其他时间图中,ckd-tree和bckd-tree显示了最好的权衡。EdgeLog比EveLog快几倍,虽然两者在空间上都比ckd-tree重四倍。EveLog的性能差是由于事件日志的遍历。


        我们使用弱和强语义来评估时间间隔边缘操作的时间性能。该实验包括四个不同的间隔尺寸,对应于图的寿命的0.1,1,10和50%。我们通过选择源和目标顶点和时间瞬间(如本节开头)来生成2000个查询。对于间隔大小,我们通过将间隔的结束定义为开始时刻加上生命周期的百分比来设置查询间隔。使用这种方法,我们在同一组顶点上每个间隔运行2000个查询。时间性能以每个查询的μs为单位。 为了完整性,我们还添加了一段时间内Edge操作的运行时间。我们省略了EveLog结构,因为它比任何其他结构慢几倍。

        评估是在I-Powerlaw和I-Wiki-Links图表上进行的,因为它们恢复了具有短和大寿命的图的时间性能。图14显示了弱和强语义的评估。运行时间遵循在时间瞬间评估中获得的相同性能。在ckd-tree和bckd-tree中,使用强语义的时间趋向于在间隔大小增长时减小,但是使用弱语义发生相反的情况。发生这种情况是因为重叠间隔的所有联系人都必须恢复。该规则的例外是CAS,其时间性能随着间隔大小而增加,而不管语义。

6.4.2 Direct and reverse active neighbors


该部分呈现对时间性能的评估,以检索在时间瞬间和在时间间隔期间活动的直接和反向邻居的集合。对于这个实验,我们运行从联系人集合随机选择的2000个查询,遵循上一节中使用的相同策略,但只选择每个联系人的源顶点。我们测量了报告的每个触点的时间性能(μs)和每触点的位数(bpc)。图15和16显示了使用每个图的最佳配置(第6.3节)的DirectNeighbors和ReverseNeighbors的空间 - 时间折衷。

        我们的ckd-tree和bckd-tree总是胜过kd-树至少一个数量级。在ckd-tree实现最小空间的图中,它也实现了良好的时间性能。bckd-tree的桶大小的变化如预期的那样工作,在增加数据结构的大小的情况下减少具有更大桶的检索时间。CAS和CET在具有越来越多的具有长寿命的活动边缘的图中具有良好的性能。然而,CAS对于回答ReverseNeighbors操作非常慢。对用于表示点接触图的CET的修改非常好,在这些图中实现最佳性能。如前所述,EdgeLog具有良好的时间性能,但它至少需要四倍的最小结构的空间。TGCSA结构在增量图上对DirectNeighbors和ReverseNeighbors具有良好的时间性能。

        如图所示,ckd-tree,bckd-tree和CET的时间性能对于DirectNeighbors和ReverseNeighbors操作都是相似的。时间性能的小变化是由于输出中的触点数量。在I-Powerlaw和G-Flickr-Days中,ckd-tree和bckd-树比在该空间的小部分中存储Snap.k2-tree慢3到9倍。 CET和TGCSA具有类似的时间性能,但它们使用比ckd-tree更多的空间。

        关于时间间隔查询,我们还评估了弱和强语义下的时间性能。实验包括四个不同的间隔大小,对应于

0.1,1%,10%和50%的寿命。我们按照相同的策略为Sect中的区间评估生成2000个查询。 6.4.1。时间性能以每个查询的毫秒计。 为了看到语义的效果,我们还报告输出中的联系人数量和一个时刻的每个查询的时间。我们对I-Power Law和I-Wiki-Links图进行了实验,因为它们反映了具有短和长寿命的图的性能。

        请注意,我们不会评估增量图上间隔查询的性能,因为它们可以缩减为时间即时查询(正如我们在第2.1节中指出的)。我们跳过间隔ReverseNeighbors操作的结果,因为ckd-tree,bckd-tree和CET的时间性能与DirectNeighbors操作类似。CAS在ReverseNeighbors中的不良性能在时间间隔查询中仍然很差。

        图17显示了ckd-tree,bckd-tree,CAS和CET的时间比较。 如所期望的,强语义的输出大小随着间隔大小的增加而减小。对于弱语义,发生相反的情况,其中输出大小总是增加或保持相同。

        像时间即时查询一样,我们的ckd-tree和bckd-tree的I-Powerlaw图的性能优于CAS,但在弱和强语义中比CET慢。在I-Wiki-Links图中,时间性能类似于在时间瞬间获得的时间性能,除了大间隔。在强语义中,CAS和CET的时间性能随着间隔大小而增加。这是由于数据结构的本质,基于计数方法来检索边的状态。因为ckd-tree和bckd-tree搜索具有大于或等于查询的时间间隔的联系人,所以它们不遭受这个问题,并且时间性能随着间隔大小减小。

        使用弱语义,时间趋向于随着ckd-tree和bckd-tree中的间隔的大小而增加。在最大查询间隔,生命周期的50%,ckd-tree获得最差的性能。我们检查这种增加与用于删除重复的顶点的额外步骤没有关系,也通过运行查询而没有额外的步骤,并获得类似的性能。在这种情况下,CET和CAS的性能不随间隔的大小而改变。EdgeLog和TGCSA的性能不随时间间隔的语义和大小而改变。事实上,它们在两个时间图中的时间瞬间上具有与DirectNeighbors相同的性能。

6.4.3 Snapshot retrieval

       我们研究了在某个时间点检索所有活动边缘的集合的性能(快照操作)。我们比较了四个不同时刻的平均检索时间:时间图的寿命的25%,50%,75%和100%。图19提供了每个时刻的活动边沿的平均数量,即期望的输出大小。对于ik2-tree,我们通过检索在查询时间之前改变其状态为活动/非活动的所有单元格的状态来计算操作。性能被测量为以秒为单位执行查询的时间。

       图18显示了图表I-Powerlaw,I-WikiLinks,G-FlickrDays和P-WikiEdit的时间性能。可以看出,ckd-tree和bckd-tree的时间性能比基于序列的结构在间隔接触和增量图上快几倍。 在点接触图中,CET优于我们的建议。考虑到I-Powerlaw的动态性,其在每个时刻具有恒定数量的活动边缘(图19a),很清楚,ik2-树,CAS和CET的计数方法在寿命 的图表。然而,在具有越来越多的活动边缘的图中,这似乎不是真正的问题,例如图1中所示的I-WikiLinks和G-FlickrDays。ckd树的性能遵循TGCSA的相同趋势,对IPowerlaw稳定,并且对于I-WikiLinks和G-FlickrDays图形增长。

        关于P-WikiEdit图的性质,使用单位持续时间的联系人,由ckd-tree和bckd-tree获得的不良结果并不奇怪,因为在每个时刻只有很少的联系是活动的。然而,查询时间非常快,需要5-10μs之间检索这些联系人。


6.4.4 Events on edges
        此部分显示ActivatedEdges查询的性能,检索在时间点或时间间隔期间已激活的边集。 对于评估,我们产生2000个随机时刻,在相应的图的寿命期间均匀分布。对于每个时间点以及在四个不同大小的时间间隔上进行实验,这对应于时间,一小时,一天和一周。 性能被测量为以μs为单位执行查询的平均时间。评估只考虑ckd-tree,bckd-tree和cet。在其他数据结构中,如CAS,EdgeLog和EveLog,这种类型的查询的性能非常差,而对于TGCSA和ik2-tree,这些查询尚未实现。我们只在这里报告ActivatedEdges查询的时间性能,因为策略(搜索范围)类似于获取DeactivatedEdges和ChangedEdges查询。图20示出了具有一秒的时间粒度(即,在I-Wikipedia-Links,G-Flickr-Secs和P-Wiki-Edit图形上)的图表的性能。可以看出,CET是用于检索在时刻激活的边缘的最快结构。这些结果适用于三种类型的时间图:间隔接触,点接触和增量。
         当间隔大小为一小时时,CET的时间性能与ckd-tree和bckd-tree相同。在更大的时间间隔(一天和一周),ckd-tree和bckd-tree获得最佳性能。虽然我们只给出了维基百科链接的时间间隔结果,但是G-Flickr-Secs和P-Wiki-Edit的性能相同。

6.4.5 Effect of partitioning contacts in interval-contact graphs
         I-Wiki-Links和G-Flickr-Secs图形的活动边缘的类似增长(参见图19)使得我们认为I-Wiki-Links共享增量图形的一些属性。类似地,I-Yahoo-Netflow图在每个时刻具有低数量的活动边缘,这也表明一些联系人仅在一个时刻是活动的,如在点接触图中。这使得I-Wiki-Links和I-Yahoo-Netflow图表是测试在Sect中提出的分区技术的有用性的良好候选者。 4.3。事实上,I-Wiki-链接中的42%的联系人属于增量类(即,在生命周期结束时有307,690,160个活动边缘),并且I-Yahoo-Netflow中的89%的联系人在时间瞬间是活动的 。因此,我们将这些图形的联系人分成一组表示增量和点接触类中的联系人的3D元组,以及表示其他类型的联系人的一组4D元组。
        表6显示了4D和3D + 4D表示的空间和时间性能。时间性能被测量为每个查询运行DirectNeighbors操作的平均时间,如6.4.2节所述。空间使用以每触点位数(bpc)为单位。 在I-Wiki-Links中相对于4D表示的分割的改进比率是0.89,并且在I-Yahoo-Netflow中的平均改进比是0.8。在I-Wiki-Links中,时间也提高了,在4D表示的性能的0.90和0.95倍之间。使用带有联系人分区的ckd-tree的I-Yahoo-Netflow图表上的查询比使用具有4D表示的ckd-tree慢10%,但是在与bckd-tree类似的时间运行。虽然将时间图的接触通过其时间行为划分的想法听起来很简单,但在实践上工作得很好。
6.4.6 Sensitivity analysis with respect to out degree and number of contacts
        此部分显示灵敏度分析,以便检查如何在ckd-tree中回答查询的时间取决于直接邻居的数量(聚合图中的出度)和每个顶点的联系数。 对于这个提议,我们通过选择聚合图(即,由时间图的边缘组成的静态图)的度数分布并且向每个边缘分配多个接触来生成三个合成时间图。这个策略在[12]中用来评估基于序列的结构的性能。
         表7显示了合成图的主要特征。 在BA.100k.U1000和BA.100k.U100中,聚合图对应于从Barabási-Albertmodel [1]创建的Powerlaw度分布和每个边缘的均匀数量的触点(分别为1000和100个触点)。ER.1M.P10图在由Erdös-Rényi模型生成的聚合图上遵循均匀度分布[1]。每个边缘的触点数量遵循α= 1.0的帕累托分布。
        在进一步讨论之前,我们给出表8中结构所使用的空间。ckd-tree的空间位于熵H之下,但它高于EdgeLog所使用的空间。但是,正如我们将在下面看到的,和Caro等人 [12]指出,EdgeLog和EveLog的主要缺点是处理事件列表和邻居邻居的时间。其他结构使用比ckd-tree结构更多的空间。
        在第一个实验中,我们评估了结构相对于每个顶点的接触数的灵敏度。图21显示了每次查询检索DirectNeighbors和Edge操作的平均时间,按照ER.1M.P10图中的每个顶点的联系数(每个顶点的可变数量)进行分组。ckd-tree和bckd-tree,以及CAS和CET,相对于查询中的顶点的联系人的数量不改变它们的时间性能。相反,EdgeLog和EveLog都会随着联系人数量的增长而增加回答查询的时间。注意,在本评价中,TGCSA的工作速度比其他结构慢得多,与6.4.2节中的时间性能评估相反。
        在第二个实验中,我们评估了相对于顶点的偏离程度的灵敏度。图22显示了在BA.100k.U1000和BA.100k.U100图上回答DirectNeighbors查询的时间,按照顶点的出度进行分组。ckd-tree和bckd-tree的时间在两个图上都是稳定的。BA.100k.U1000图形的时间增加,因为该图形具有十倍于BA.100k.U100的每个顶点的接触数目,但是在每个顶点的出度上仍然稳定。正如预期的那样,回答CAS和CET查询的时间有效地随着离开程度而增加。在第一个实验中获得的结果保持EdgeLog和EveLog,并且如果我们比较BA.100k.U1000和BA.100k.U100曲线的曲线的斜率,则时间随着每个顶点的接触数而增加。如前所述,TGCSA的性能很差,比其他结构慢几倍。

7 Conclusions and future work
         这项工作提出了Compressed kd-tree(ckd-tree),这是对原始kd-tree的改进。这种结构的主要优点是其有效利用空间,比输入数据稀疏并且不共享任何聚类属性的kd树的最坏情况好几倍。它还保证不考虑任何规则性,等于表示具有m个活动单元的4D二进制矩阵所需的位数目的下限的渐近空间。虽然这个新结构可以用于任何d维空间,但它特别适用于表示4D和3D中的时间图。
        使用所提出的结构,可以仅根据正交范围搜索来定义所有时间图图形的计算,这是比CET,CAS,TGCSA,EdgeLog和EveLog结构中的查询的特别编程更简单的机制。这是可能的,因为每个维度(即,顶点和时刻)以相同的方式被处理。此外,DirectNeighbors查询的性能与ReverseNeighbors查询的性能相同,如在CET和TGCSA结构中。实验表明,我们的数据结构的空间接近使用压缩位图的kd-tree的最快版本的50%。此外,它可以比用于在给定时刻恢复图的状态的查询的先前建议CET和CAS快几倍。此外,它比TGCSA小几倍,并且还能够在所有操作中恢复联系人的所有组件。
        我们还比较了所提出的结构的空间使用与ik2-tree用于时间图的空间。在这种情况下,ckd-tree比ik2-tree使用多达50%的空间,或者在ik2-tree(G-Flickr-Days数据集,使用寿命短)的最佳情况下使用相同的空间。关于时间性能也发生相同的情况,其中ckd树对除了G-Flickr-Days数据集之外的所有数据集的性能优于许多倍的ik2-树,在这种情况下,两个结构显示相同的时间性能。在敏感性分析中,我们表明,操作的时间性能不依赖于每个顶点的联系数,也不取决于聚合图的出度,正如其他结构中发生的那样。
        请注意,ckd-tree可以用在其他数据是多维的上下文中,例如RDF中的三元组,非聚类3D区域,甚至用于存储和查询栅格数据的演变。在这些上下文中广泛的实验评估留给未来的工作。作为未来的工作,我们需要检查我们是否能够压缩桶中的孤立的单元格。现在,这是B +树的许多工业实现中的当前技术。初始实验表明,如果我们使用xor编码存储它们,桶中的孤立单元的熵可以提高[29],但这还不够,因为我们需要一个快速的解压缩模式来保持性能。关于4D和3D二元矩阵中的时间图,我们认为考虑边缘的激活/去激活的时间的节点排序可以有助于改善矩阵中的单元的聚类。这种机制对于改进用于存储在k2-tree中的静态图的压缩和时间是有用的。我们还需要改进对增量图(例如Wiki-Links数据集)的共享特征的时间图的分区方法,因为空间仍然远离由其他结构获得的最小值。















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值