孟凡荣等所著《多版本TPR树》。文中参考TR树构建了多版本TPR树。文中称多数算法参考TR树,我并没有看过TR树的文献,故具体算法尚不清楚。仅从文中所述来看TPR树是一种全时态的索引。其中的每一条记录都有一个起始时间和一个终止时间,并设置一个特定的终止时间代表“未来”,以表示这个记录尚未终止。每当一个记录被终止的时候(比如删除或者更新),都将这个记录的终止时间由“未来”改为一个固定的时间,然后把父节点的指针指向这个节点修改后的一个副本(如果是更新)或者把父节点的指针置空(如果是删除)。这样一来,如果根节点更新,就会产生一个新的根节点;如果中间节点更新,相当于子树产生了一个新的根节点。因此这一数据结构称为“多版本”。多个根节点可以用队列或者哈希表管理。由于整个树自始至终没有真的进行磁盘删除操作,所以旧节点的指针仍然有效。那么,提出查询的时候,先根据时间判断应该查询哪个根节点,然后逐级向下判断即可查到记录过去的位置或者未来的位置。这个做法有明显的缺陷,如果更新频率很高,则索引会迅速增大。但是考虑到全时态数据库的数据自身生长速度也极快,这个缺点或许可以容忍。另一个问题或许更为致命。文中称当一个MBR被删除或更新时发生“版本分裂”,那么,在极端情况下,树只有根节点,当其中的一个记录发生更新后,更新前的那个记录将失去父节点。记录发生更新时令其父节点版本分裂也不现实,因为这意味着每次版本分裂都会导致根节点版本分裂。虽然没有证实,但是这个问题似乎有可能导致时间轴断裂。这个问题具体如何解决可能要参考TR树的算法。

金泽峰等所著《TPR树性能优化研究》。文中对TPR树提出了两点改进。其一是节点分裂算法。TPR树的节点分裂算法继承了R*树算法,根据周长选轴,根据面积分组。而此文作者经试验后认为,应当根据边长选轴,根据周长分组。根据边长选轴可以简化计算而不会导致太差的性能差距,根据周长分组可以简化计算、不会导致太严重的性能差距、容易产生更接近正方形的分组。另一个改进是树的调整策略。当TPR树发生更新时(插入前或者删除后),检查相应叶子节点中有没有超过某个阈值的记录。如果有,则重新插入。这个阈值采用动态值,与整个索引空间在各轴上的投影长度线性相关。此文作者通过实验认为,这样修改后的TPR树性能更好。

李东等所著《基于Quadtree和Hash表的移动对象全时态索引》。文中提出了一种全时态索引,实际上已经类似于提出了一种数据管理方式。这种索引方式对每个对象都提供一个标识,使用哈希表将所有的移动对象管理起来。将移动对象的历史轨迹划为线段,串成一个线表。移动对象的当前位置则存入四叉树索引中,同时四叉树中的记录也包括移动对象接下来一段时间的速度矢量。哈希表的每个记录里包含指向历史轨迹链表头的指针和四叉树叶子节点的指针。当移动对象的速度发生改变时,即将上一段轨迹存入哈希表,然后更新四叉树。更新四叉树的时候可能需要修改记录在四叉树中的位置,并有可能导致四叉树节点的分裂或合并。如果试图查询某时刻某对象的位置,就要判断查询时刻与当前时间的位置。如果查询时刻是当前或者未来,则查找四叉树;如果查询时刻是过去,则在哈希表中查找。如果给出一个时间窗一个空间窗,同样需要判断查询时间与当前时间的关系。查询时需要遍历整个哈希表和整个四叉树中的所有移动对象。另外,由于有哈希表的存在,因此可以支持标识查询。这个数据结构的一个可取之处是全时态性。另外一个可取之处,也是作者所强调的,即索引的更新效率高,避免了TPR树各种复杂的分裂和更新操作。作者认为移动对象速度频繁改变,因此更强调更新效率。但是这个数据结构的缺点也是明显的。TPR树之所以受到推崇,是因为它在划分空间范围的时候考虑了移动对象的速度矢量。而本文基于四叉树,空间划分完全没有考虑移动对象的速度矢量。所以对于空间查询,本文所述的查询算法要求遍历所有移动对象。作者也承认,本索引查询性能低于TPR树。还有一个小问题,作者对于查询时间的处理上,要求判断查询时间与当前时间的关系,这可能会导致错误。如果一个移动对象在2秒前更新,要求查询其1秒前的位置,正确的做法是查询四叉树,但是按照文中所述会去查询哈希表。解决这一问题的正确做法是判断查询时间与相应移动对象最后一次更新的前后关系。但不同移动对象的最后一次更新时间不同,这样一来,似乎表明应该在哈希表里存储移动对象的最后更新时间。这个数据结构还有一个可取之处,即以哈希表存储所有移动对象,然后每个移动对象串一个历史轨迹链表。这可能是一种比较通用的全时态索引思路。

张驭等所著《TPR+-tree:一种面向预言查询的有效时空索引》。文中提出了“双极值子节点”的概念。如果n是节点N中在第d维上速度最大(或最小)的记录,且n又是N中在第d维上最左(或最右)的记录,则n被称为N在第d维上的双极小(或极大)值子节点。显而易见,双极值子节点对索引性能的影响比其他子节点大。相对TPR树,TPR+树首先修改插入过程中的算法ChoosePath。TPR树的算法ChoosePath无法解决这样一个问题:如果一个记录插入两个节点后两个节点的面积增加值、重叠面积增加值均为0(称为两个节点均不退化),那这个记录应该插入哪个节点。TPR+树提出,当遇到这个问题时,应尝试消除重叠,消除重叠的方法是对双极值子节点执行重新插入。简单来说就是,从不退化的节点开始向下寻找不退化的子节点,直至找到叶节点或一个节点中的所有子节点均不退化;然后对每个查找路径末端的子节点执行双极值子节点的提取;然后收紧查找路径上所有节点的外包矩形,收紧的时候又要对相应节点执行双极值子节点的提出和重新插入;最后把查找路径末端的双击值子节点进行重新插入。上述算法在执行的时候有可能导致循环调用,此文作者认为这种循环调用将会使整体的重叠现象得到改善。为避免死循环,作者也设置了一些处理规则。

廖巍等所著《基于速度分布的移动对象混合索引方法》。文中提出了HVTPR树(Hybrid Velocity

distribution based Time-Parameterized

R-tree,基于混合速度分布的TPR树)。由于速度的不同是导致TPR树性能恶化的主要原因,所以HVTPR树先设置了一个速度桶链表,链表中的每个节点代表一个速度域、每个节点指向一个TPR树。这就使得同一个TPR树中的所有对象有相近的速度,从而避免索引性能恶化。速度桶中也包含MBR与VBR,从而使得在查询的时候不必遍历所有的TPR树。另一方面,HVTPR树将所有对象存入一个哈希表中,用于定位对象在HVTPR树叶节点中的位置。HVTPR树支持自低向上更新,因此树中的每个节点都有一个指向父节点的指针。所谓自底向上更新是指,当更新的时候,首先根据哈希表找到叶节点进行修改,然后沿父指针向上寻找父节点进行修改。这样就避免了复杂的堆栈或者递归。文中没有涉及R*树所描述的强制重插入。但是从算法描述上来看,即使进行强制重新插入,也应当会比较简单。

何凯涛等所著《动态环境下移动对象索引技术研究》(廖巍是第三作者,这篇文献发表时间晚于HVTPR树的文献)。文中提出了ETPR树(Enhanced

Time-Parameterized

R-tree,强化TPR树)。这种索引结构同样采用了HVTPR树所采用的速度桶概念。插入、删除、查询算法也与HVTPR树类似。本文使用了另外一篇文献中提出的HBU批装载技术,可以根据索引每层预期的节点数和当前层矩形包围框数目由底向上构建TPR树。具体做法没有详细讲,我也没有看其引用的那篇文献。另外本文提出了速度桶的构造算法,构造的算法要求给定两个维度上的速度分布直方图,并给定速度桶的总数目K,要求输出一个最佳的速度桶构造方案。构造思路如下。首先,要构造K个速度桶,相当于要求把x轴方向(横向)的所有速度分为Vx组,y轴方向(纵向)的所有速度分为Vy组,并要求Vx*Vy=K。其次,当指定一组Vx和Vy以后,就要按照一定的算法分别在x轴和y轴上对速度进行分组。以x轴为例。算法已经得到了x方向上的速度分布直方图,并且已经知道了要在x轴上分Vx组,如果一共有n个对象,那么第一组就是直方图上最左边的n/Vx个对象,第二组时接下来的n/Vx个对象,如此一直划分下来形成分组结果,并返回。返回值是什么尚不清楚,从原理上说似乎应当是一组VBR。最后需要对若干组返回的速度桶方案进行优选。文中给出了一个优选公式,但是由于不知道返回值是什么格式,所以这个公式的含义尚不清楚。如果返回值是一组VBR,那么公式似乎是将VBR对时间进行积分。

廖巍等所著《TPR*树索引构建及其动态维护方法》。此文又晚于ETPR树的论文。此文使用了与ETPR树相仿的由底向上构建算法和速度桶计算方法,不再赘述。本文提出了溢出桶的概念,即插入时不直接写入磁盘中,而是先存入内存中的溢出桶里,待溢出桶满后一次性写入磁盘中。而进行查询时先查询溢出桶,再查询树。这个做法的目的显然是为了减低IO次数。

廖巍等所著《面向移动对象的高效预测范围聚集查询方法》。本文所称的预测范围聚集查询指查询时使用Count、Smut、Avg、Max、Min等SQL函数,直接返回查询结果的统计值而不是返回一组查询结果。此文作者指出,传统上实现预测范围聚集查询有两种途径,第一是用普通查询返回一组结果,然后对结果进行统计,第二是用抽样的方法返回近似结果。作者认为这两种方法都不好,因此构建了PRA索引。此文与HVTPR树的文献发表于同年,文中索引的结构也与HVTPR树十分类似,都是最上层一个速度桶链表,最下层加一个哈希表存储对象在叶节点的位置,树中的每个节点都既有指向子节点的指针也有指向父节点的指针。区别是在速度桶以及每个节点中均保存自身的统计信息,这样如果查询矩形包含整个节点,就不需要继续向下查询子树了。索引构建算法使用了批装载技术,插入删除算法与HVTPR树相似,区别仅在于调整路径上的统计信息。更新算法与HVTPR树不同,直接采用了先删除后插入的算法,当然删除的次序是从底向上删除。为了便于查询,此文作者提出一个定理:如果在查询时间段内一个MBR四个顶点都曾落入查询区域,那么这个MBR中的所有点都会在查询时间段内经过查询区域。根据此定理,我们只需计算每个节点的MBR四个顶点落入查询区域的时间。如果这个时间都在查询时间段内,就没有必要访问子节点了。

posted on 2023-12-28 12:50  周正阳  阅读(2)  评论(0编辑  收藏  举报