zoukankan      html  css  js  c++  java
  • 线段树

    1.线段树处理什么问题?

    线段树主要处理区间的元素修改和查找问题,比树状数组适用范围广,但常数较大;

    2.线段树是什么?

    线段树,是由线段组成的树?是,但不准确。
    我们看一下他解决的问题,你会发现,用暴力的话,时间复杂度大概是O(n*q);
    很显然,这样的复杂度在提高组中是不被允许的,所以我们急需一种更为高效的算法。
    于是,线段树横空出世!(此处应有掌声......)
    观察暴力思路,我们发现,时间主要是浪费在枚举上。
    我们需要考虑的是区间,而暴力则必须一个一个元素的处理,所以,我们可以建一棵代表一段区间的树,进行区间元素的处理。我们称之,线段树。

    3.线段树怎么实现?

    首先,我们考虑一段数列:
    我们假设其为:1 2 3 4 5 5 6;
    我们要将第一个到第5个加1,怎么做?
    我们可以先将一棵树,根节点为1至n(n为元素个数)
    然后将这个区间二分,分为左右两个区间,左节点为左区间,右节点为右区间。这样一直分下去,直到不可分为止。(图见教材)
    这样,我们就得到了一颗线段树。
    当我们要修改某个区间值时,我们只需修该被它包含的最大节点(即最前节点,因为此节点区间包含它的子树所包含的所有区间,所以不用向下考虑)的值即可。就像1至5,可将其分为1至3,4至5,只需修改两次即可。
    由线段树的构建方法可知,每一个区间都可以这样完全划分。所以此算法正确。
    那么,只这样修改后,如果我们需要调用他的子树怎么办?他的子树没有更新呀!要是我们每修改一次就更新它的子树,就太慢了。所以,我们用一个lazy标记,
    显示他的子树需要被更新,及其数值,然后,我们就可以一边查找,一边更新了。
    关于多重线段树,呵呵,自己看吧,我的手好不想被一篇博客废掉(微笑)

  • 相关阅读:
    正整数分解质因数
    水仙花数
    键入任意整数,将之从小到大输出
    有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
    输入某年某月某日,判断这一天是这一年的第几天?
    java 日期增加
    oracle数据库 ORA-01461: can bind a LONG value only for insert into a LONG column解决方案
    JAVA实现图片叠加效果
    JAVA_GET请求URL
    sqlserver-触发器-判断更新了哪个字段。
  • 原文地址:https://www.cnblogs.com/lxyzlzj/p/13371987.html
Copyright © 2011-2022 走看看