线段树采用数组储存时,无疑,其储存空间利用与其左右子树定义有关
方式一:

  • 左子树:[l,l+r2][l,\frac{ l+r}{2}]

  • 右子树:[l+r2+1,r][\frac{ l+r}{2}+1,r]

方式二:

  • 左子树:[l,l+r+12−1][l,\frac{ l+r+1}{2}-1]

  • 右子树:[l+r+12,r][\frac{ l+r+1}{2}, r]

假设定义区间[1,5][1,5]的线段树,很容易看出它们的不同
方式一:

方式二:

由此初步看来,采用第二种方式定义,可能会在其左边产生较大的空白区域。
实际上也的确如此,
为了方便我们的习惯,考虑第一种方式定义情况
对于某一区间[l, r],当区间元素个数为偶数时,这很好,因为这样左右子树分得相同多的叶结点,也即是左右区间长度相等;如果区间为奇数,这意味着其中一边不得不多拿一个叶结点,而究竟谁多拿,依靠你判决左右子树的策略,例如方式一:左边多,方式二,右边多。
思考这样一个问题其实是有利于我们明白当区间长度逐渐增大时,最后两层叶结点它们的变动情况。依靠你的判决策略,当当前结点区间长度为奇数时,多拿的一方会将这种方式逐层传递,例如这里,左边多一个结点,最终会被传递到最下层
好了开始我的问题,假设一开始,给出的区间长度为4,你很容易画出它们的线段树图形(一棵满二叉树),区间增加为5时,图也已经给你了(方式一),如果现在,区间增长为6,你应该也能画出它们的图形

如果我再增加呢?增加到7,然后再增加到8呢?(8是一棵满二叉树)

仔细想想,线段树的形状随着区间长度增加(数组元素增加)实际上遵循这样一个规律,从一颗满二叉树,到另外一课满二叉树,每次递增时,会多出一个叶结点(减少一个,增加两个),好像是,在原来树的基础上首先判断当前结点左右子树区间长度(即是叶结点个数)是不是一样的,恩,如果不一样把这个结点再安排到叶结点少的那棵子树上,使其左右平衡,如果一样了,再把就它放到左子树上(依据左右子树划分策略,这里为方式一)
从另外一个角度看,好像也是合乎情理的,线段树的区间均分使得它含有这样一个性质,左右两边的叶结点个数(区间长度)之差小于等于1。

这样看来,线段树不就有点平衡二叉树的意味了么?是的,它的确是一颗平衡二叉树,在我的上一片文章中也有简单探讨

好了,明白了这些,我们接下来讨论为什么线段树要开出4N的空间

给你一棵满二叉树,其叶结点个数为N,问,有多少个非叶结点?
方法是很简单多样的,你可以选择求和,也可以根据二叉树的一些性质,这是容易的。
考虑

n0+n1+n2=2n2+n1+1

n_0+n_1+n_2=2n_2+n_1+1
注意到此时, n0=N,n1=0n_0=N, n_1=0
所以

n2=N−1

n_2=N-1总共有N-1个非叶结点

考虑极端情况,方式二,且最后一层只有两个结点(如上图方式二的图那样)
此时,有N个叶结点,倒数第二层有N-1个结点
因此,除去最后一层的两个结点外,总共有

(N−1)+(N−1−1)=2N−3

(N-1)+(N-1-1)=2N-3由于是数组储存,最后一层有

2×(N−1)=2N−2

2\times(N-1)=2N-2个结点(含空结点)总计结点个数为

2N−3+2N−2=4N−5

2N-3+2N-2=4N-5好了,这就是最终最坏的结果

为什么这是最坏的情况?对于一棵满二叉树(N=2kN=2^k),无疑,是最好的,此时储存空间达到最小,为2N(注意这里算上了0位置,结点为2N-1),当区间长度增加1时,情况马上变坏,因为你不得不开出近似4N的空间来储存它,剩出多个没有利用的空间了,接下来,你可以松口气了,因为直到填满下一个二树前,这些空间都是足够的。

而对于方式一来说,在大多数情况下,没有方式二来的那么剧烈,一下子增加到4N,恩,先左边加一点,然后隔一段距离,右边加一点,然后左边,然后右边,每次右边增加时左边的储存就不用管了,因为已经足够。

因此可以看出,开出4N,最坏情况下,也可以得到满足

一个有意思的问题是,什么情况下方式一达到最坏呢?是不是方式一最坏的情况下空间也是需要达到4N呢?

好像有点复杂(逃~)

不过可以设想的是,应该没有方式二那样如此耗费空间才是。
假设数组元素个数为N,最后一层结点为4,如果你明白了我前面的有关线段树叶结点变动的说明,你应该能理解它究竟是怎样一幅图

好了,除去最后一层结点,总个数为

(N−2)+(N−2−1)=2N−5

(N-2)+(N-2-1)=2N-5最后一层结点个数(含空结点)为

(N−2)×22+1=N−1

\frac{(N-2)\times2}{2}+1=N-1

总个数为

2N−5+N−1=3N−6

2N-5+N-1=3N-6
注:这只是第一次出现最坏的情况,这有可能并不是最坏的情况,可能存在某些中间态。
不过可以看出的是,相较于第二方式,可能储存上相对较为节省空间
不过,总体来说,从第二种方式来看,线段树开4N,的确是有必要的

线段树开4N空间证明相关推荐

  1. P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  2. 线段树开新坑:kuangbin带你飞

    写在最前面的废话 这里I以前的题是暑假刚刚开始的时候在家写的,然后多校一波就荒废了 9月开头回家一波,重新填坑,= =,kuangbin带你飞的pdf,这才一半题,后面还有一波,蓝瘦,慢慢写吧,不写题 ...

  3. 线段树合并复杂度证明

    前言 近期对线段树合并有了更深的了解,所以在这里写一下一些自己的想法 适用问题 线段树合并有一类经典的模板,现在对于一棵有n个叶子节点的树(Tip:对于一棵nnn个叶子节点的树,其节点数量小于等于2n ...

  4. CodeForces - 960F[动态开点线段树优化dp]详解

    题意:给一张有向图,每条边有边权与编号,求一条最长的路径,这条路径的边权与编号都是递增的.(编号指输入顺序) 首先我们回忆一下普通得LIS得做法:就是dp[i]以第i个结尾得最长上升子序列的长度,那么 ...

  5. 线段树的数组大小下限及证明

    线段树的数组大小下限及证明 手动博客搬家: 本文发表于20170820 20:23:52, 原地址https://blog.csdn.net/suncongbo/article/details/774 ...

  6. 【学习笔记】线段树的数组大小下限及证明

    手动博客搬家: 本文发表于20170820 20:23:52, 原地址https://blog.csdn.net/suncongbo/article/details/77432667 线段树是一种将一 ...

  7. 数据结构---线段树

    线段树 转载请注明出处,谢谢!http://blog.csdn.net/metalseed/article/details/8039326  持续更新中···   一:线段树基本概念 1:概述 线段树 ...

  8. hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...

  9. Mayor's posters POJ - 2528 (离散化+线段树)

    题意: 在1~10000000这个区间中读取n个海报的区间信息,后面的海报会覆 盖前面的海报,问最后能看到几张海报.(本题是一道bug题下面会提) 题目: The citizens of Byteto ...

最新文章

  1. rabbitmq3.5.1 原理和集群安装
  2. 算法高级(37)-微信、微博中的好友关系该如何设计?
  3. 手动实现apply、call、bind
  4. Scrum立会报告+燃尽图(十月二十二日总第十三次)
  5. 4x4矩阵键盘c语言程序,C语言矩阵键盘程序
  6. 读书行动笔记2013第2本:《整理的艺术》
  7. at+cipstart返回state:tcp close解决方案 SIM868模块使用
  8. 力扣算法题用c语言实现,刷题-力扣-25
  9. 大数据薪水大概多少_大数据工资一般多少
  10. 关系型数据库大数据性能优化解决方案之:分表(当前表历史表)、表分区、数据清理原则
  11. 查看云主机是否有显卡,配置如何?
  12. 一位算法工程师对自己工作的总结,非常具有借鉴意义!
  13. office文件在线预览
  14. 卖书如何通过B站引流?方法用对后效果都不会太差
  15. 基于UE4+ OpenCV 的混合现实 (webCamera, mix-reality, blue screen matting)
  16. [仅ESP32] BT AT命令
  17. ubuntu 1604 ppa.launchpad.net下载速度慢
  18. 必备Linux命令和C语言基础
  19. PAT 1071.小赌怡情
  20. 计算机课程合并建,计算机基本说课合并.ppt

热门文章

  1. 北交所开通知识测评 测试题答案(海通)
  2. 申请ssl 验证域名 失败了 中间证书
  3. PHP教程之实现用户注册实例
  4. 微信小程序实名认证接口_人脸核身接口整理
  5. 关于office2013打开后始终显示正在配置问题的解决方案集锦
  6. 5G网络学习(三)——大白话讲解PDU会话(未完待续)
  7. 简化SQL式计算之行间计算
  8. python3+selenium爬取笔记本电脑详情信息
  9. OSChina 周六乱弹 ——孙悟空脱发是什么体验
  10. 重庆大学明月科创班课程记录1.1大一上自然与设计-仿生蝗虫设计(Solidworks)