线段树内存到底该开多大?——浅谈线段树占用内存(附证明)

结论:对于一个维护序列长度为n的线段树,用堆结构存储的话,数组大小应开4*n,这样,在n为正整数的所有情况下内存都够用,且在最极限的情况(n=(2的整数次幂 加上一个非常小的数))下,内存刚好够用,数组下标刚好比线段树数组中会使用到的最大下标(4n-2)多1。

证明(本文对数的底数默认为2):

  前置数学知识:高中数学必修一对数相关,二叉树的一些基本性质

  当n为2的正整数次幂时,设n=2^k,此时线段树正好是一棵叶子数为n的满二叉树。若n更大一些,但还没超过2^(k+1)时,此时线段树的内存大小要按照n=2^(k+1)的情况开。

  这启示我们,当2^k <n<=2^(k+1),即k<log n<=k+1时,线段数所开大小与叶子数为2^(k+1)的满二叉树大小相同,而该满二叉树的节点数为siz=2^(k+2)-1。

  由k<log n<=k+1可得k+1=ceil(log n) , ceil()为向上取整函数,则:

    2^(k+2)-1=2^(ceil(log n)+1)-1

        =2^(ceil(log n+1))-1

        =2^(ceil(log (n*2)))-1   

  因为   log (n*2) <=ceil(log (n*2) ) < log (n*2)+1=log (n*4)

  所以     2n-1  <=  siz  <     4n-1

  结论得证。

posted @ 2020-11-25 11:13  千叶繁华  阅读(675)  评论(0编辑  收藏  举报