• 数据结构线段树1:概述与建树


    数据结构——线段树

    作为一枚蒟蒻,学习是重要的。最近,我接触了一种新数据结构——线段树。我一见,只是全身懵逼,[流汗],怎么这么蓝?

    于是,我开始努力学,努力学······(此处省略INF个努力学),决定写一下博客。

    线段树是一棵二叉树,并与分治有着密切关系。

    就说说最简单的一个例子,1~10的区间线段树。

    这棵线段树吧1~10这个区间不断de二分,最终分成一个一个数的叶节点,因此来储存一个区间。

    这里多次提到了——  区间  ——二字

    于是,蒟蒻猜想,传说中的线段树和区间有关!

    那么,问题来了

    为什么要用线段树呢?

    用数组不就行了?

    其实我也不知道

    BUT,这是一个有用的数据结构    大佬们都这么说

    好,不开玩笑了,线段树是一个非常强   如xxzh&Rye_Catcher&TYQ······(dalao de 集合)

    的数据结构。

    它支持区间询问,单点修改,区间修改作用的数据结构,还可以配合离散化进行大力时间优化,让算法复杂度大大降低。

    蒟蒻:这样好

    于是,我就开始研究。

    线段树,既然是树,就要定义数组去储存它。建造一棵线段树其实很简单,类似于二叉树,却强于二叉树。

    直接看代码:

     1 void build(int k,int l,int r)                 //k:当前节点编号  l,r为k所代表的区间
     2 {
     3      if(l==r)                                 //区间只有一个节点,即叶节点,建树后return
     4      {
     5           mi[k]=v;                            //对应区间的最小值在原序列中的对应值
    6 return; 7 } 8 int mid=(l+r)/2; //构造中间数 9 //递归定义左子树和右子树,由完全二叉树的性质可得左子树编号为2*k,右子树编号为2*k+1 10 build(k*2,l,mid); 11 build(k*2+1,mid+1,r); 12 mi[k]=min(mi[k*2],mi[k*2+1]);//更新线段树 13 }

    注释都写在code里了

    这是一个递归定义的函数,以叶(区间长为一的)节点为递归边界,不断二分,形成一棵二叉树。

    下一篇文章我们将介绍线段树的区间询问和单点修改,我们下次见。

    dalao:拍砖ing

  • 相关阅读:
    2014最后一篇英语笔记(新开始)
    记录:CSS特殊性——权值规则
    grunt--自动化打包工具使用
    【移动端】---点透事件
    [前端性能提升]--图片转化为base64
    js--cookie
    1.倒数几秒弹窗关闭
    ES6就是ES2015 的主要内容
    call 与 apply的区别
    34枚金币时间管理法
  • 原文地址:https://www.cnblogs.com/sillyben/p/9901936.html
Copyright © 2020-2023  润新知