• {{item}}
  • {{item}}
  • {{item}}
  • {{item}}
  • 天祈
  • {{item.name}}
  • {{item.name}}
  • {{item.name}}
  • {{item.name}}

算法专题——线段树

本篇随笔会随着本蒟蒻对线段树的理解而发生相对应的改变,本文偏向于意识流,仅供参考。


最简单的线段树

  最简单的线段树是基于单点修改,区间查询操作的线段树,不需要用到lazy标记,维护上需要用到PushUp函数向父节点传递最新更新完成的数据。


较简单的线段树

  指区间修改,区间查询的模板线段树,这类线段树运用到了lazy标记,lazy标记使得最新的数据只需要维护到节点以上的父节点,节点以下的子节点由于尚未访问到,不需要进行更新。维护上使用到PushUp函数和PushDown函数。

  PushUp函数用于让持有最新数据的节点的父节点为最新状态,功能上与单点修改的线段树没有太大区别。

  PushDown函数则是保证“最新的数据只需要维护到节点以上的父节点,节点以下的子节点由于尚未访问到,不需要进行更新”正常进行的重要函数。该函数使得节点向下更新,使旧节点更新到最新的数据状态

  再说说lazy标记,lazy标记与PushDown函数一起发挥作用,实现目的功能,lazy标记是让最贴近旧数据的那一层新数据节点存储向下更新的值。


数据型的线段树

  数据型的线段树是基于个人的理解进行的总结,不是真有这种东西。一般来说,维护数字类型的线段树都需要要用到PushUp和PushDown函数,前者让最新数据网上传,后者则可以维持最新数据的向下更新。下面细说

  img


 借用一张别处偷的一张图,设需要访问的区间是[3, 11),即黑框包住的部分。我规定19,5,12,26节点是New-limit节点,New-limit节点以下的成为Old节点,New-limit节点以上的称为New节点。当然这些节点的名字并不是基于查询的区间,而是基于当前节点是否为最新数据的节点。New-limit介于Old节点与New节点之间。

  PushDown函数维护New-limit与Old节点,一般会使New节点的lazy更新为0,换言之只会维护New-limit处的数据为最新数据。

  PushUp函数维护所有New节点的数据为最新数据,即维护New-limit节点以上的数据为最新数据。

  可以发现PushDown函数与PushUp函数都是基于New-limit节点进行的。根据需要进行具体的修改。

——增加于4。28

  这几天看线段树,对lazy标记有了一些新的理解,为此更新这篇随笔。上面说到PushDown管下,PushUp管上,而lazy标记作为一个区间标记,一般不进行PushUp,即lazy的最新数据只维持到New-limit层。此时NL上的节点一般会维持为不修改的标记(一般为0),那么NL下的节点的数据作为旧数据又该如何理解呢?这里给出答案,设NL下的一个节点Node,Node的lazy标记实际上的值为从NL不断向下更新到Node为止,Node可以得到的值,即所有NL下的节点的lazy标记并非是垃圾数据,而是与NL有关系的值。

  对于节点维护信息的需求,维护的节点信息应该是可以传递的,即子节点的信息应该可以通过某种映射得到父节点的信息。

posted @ 2021-04-26 19:59  TanJI_C  阅读(60)  评论(0编辑  收藏  举报