首页 > 其他分享 >读书笔记2

读书笔记2

时间:2023-12-28 12:55:47浏览次数:21  
标签:读书笔记 对象 查询 索引 算法 TPR 节点

孟凡荣等所著《多版本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四个顶点落入查询区域的时间。如果这个时间都在查询时间段内,就没有必要访问子节点了。

标签:读书笔记,对象,查询,索引,算法,TPR,节点
From: https://www.cnblogs.com/zhouzhengyang/p/17932464.html

相关文章

  • 《程序员的修炼之道》第二章读书笔记
    第2章《注重实效的途径》是《程序员的修炼之道》中的重要章节,它介绍了一些实践性的方法和技巧,帮助程序员在软件开发中提高效率和质量。在这一章中,作者首先强调了重复的危害。重复的代码和流程可能导致维护难度和出现错误的概率增加。因此,我们需要通过技术手段和工具来减少重复,如自......
  • 《马云传》读书笔记
    1、没有什么随便能成功,充分的准备2、从1分到79分谁能知道,他付出了多少?3、专科分线能被本科录取,是找有准备,并非偶然(13岁开始学英语)4、请教前辈,组织(建立规矩)5、敢于走出小圈子,去帮助别人获得成长。6、主动出击(传播思想、传播事实、传播观点,要比传播产品更重要)宣传7、中国黄......
  • 读书笔记1
    贯彻全书的一个原则是DRY(Don‘tRepeatYourself)原则,这也是每个优秀的开发人员必须要遵循的规范,编码过程中任何地方都不要重复,因为重复暂时节省的时间将会给以后的维护使用带来巨大的麻烦,如果发现代码有重复或者违反正交性等原则的地方要立刻找机会重构。这样才能够拥有更快、更......
  • 《程序员的修炼之道》第一章读书笔记
    第1章注重实效的哲学我的源码让猫给吃了这个部分讲述了一个程序员在设计软件时遇到的问题,他的源码被猫吃了。作者通过这个故事告诉读者,在软件开发中注重实效的重要性,要避免过度追求完美而导致无法交付和实际应用的情况发生。软件的熵本节介绍了软件的熵,即软件系统内部的混......
  • 读书笔记
    第一章概述一.软件工程概念的提出1968年NATO(NorthAtlanticTreatyOrganization,北大西洋公约组织)会议首次提出“软件工程”概念。软件工程是为了解决开发成本效益和软件质量的问题而产生。二.软件1.什么是软件?《IEEEStandardGlossaryofSoftwareEngineeringTerminol......
  • 《需求分析与系统设计》读书笔记3
      从第八章《数据库设计》中总结了一下知识内容:类模型和BCED类包反映了应用类,而不是存储数据库结构,实体类表示了应用中的永久数据库对象,但不是数据库中的永久类;永久数据库层可以是关系数据库,对象关系数据库或者对象数据库;数据库模型是表示数据库结构的这种抽象,包含三种抽象,分别......
  • 软件需求读书笔记
    《软件需求模式》一书中有一些经典的语句,从中我体会了很多:“需求是构建成功软件的基石。”这句话强调了需求的重要性,指出在软件开发过程中,良好的需求定义是成功的关键。“需求是用户和开发团队之间的桥梁。”这句话强调了需求在用户和开发团队之间起到连接和沟通的作用,有效的需求......
  • 探索需求读书笔记
    “一本出色的书——独特,发人深省而又有趣,这是任何从事需求过程的人员的必读书”这是Claude W.Burrill,Burrill.Ellsworth  Associates写在书的最后对这本书的赞扬,随着阅读的进行我这些天读了这本书的第三部分,第三篇探索机会同样用原来的风格讲述需求分析的知识,让我受益匪浅。......
  • 《构建之法》读书笔记(三)
      《构建之法》,读这本书教会了我在团队开发时的团队合作。   首先是代码规范:1.代码风格规范。2.代码设计规范。一.代码风格规范   1.缩进:一般用四个空格的距离,从可读性来说正好。   2.行宽:行款可以限定为100字符。   3.断行与空白的{}行:尽量......
  • 《重构:改善既有代码的设计》读书笔记二
    二、代码的坏味道1、DuplicatedCode(重复代码)坏味道首当其冲的就是DuplicatedCode,如果你在一个以上的地点看到相同的重复结构,那么这个坏味道就可以确定了,设法将它们合而为一同一个类中两个或更多的函数含有相同的表达式利用ExtractMethod(提炼方法)提炼重复代码,然后引用新......