zoukankan      html  css  js  c++  java
  • 树状数组是什么东东

              树状数组。求和,更新,求ith之前比a[i]小的元素个数!普通数组不行吗,行啊,关键树状数组快啊。贴个图:

                                                                 

     

    a数组为普通数组,c数组为属性数组,图要仔细研究研究,据说图明白了,离弄懂树状数组就不远了。

    c1=a1;    (0001)

    c2=a1+a2;(0010)

    c3=a3(够shit的学校又要熄灯了,今天就到这里)(0011)

    (继续:)
     c4=a1+a2+a3+a4    (0100)

    c5=a5    (0101)

    c6=a6+a5    (0110)

    .....

    .....

    ......上面每一个等式后面括号内的二进制码对应树状数组的下标 ,不知是否看出来等式左面的项数  等于   其下标二进制码  从右端开始出现的第一个1所代表的数值,再结合上面的图,是不是看的差不多了。树状数组的这种构造也正是其精华,上文讲到用其求和,或是求数组中(指的是普通数组a)第i个元素之前有多少个比他小的元素。当然要想做这些操作,首先要明白如何实现树状数组。下面有两个函数:

                               update(int i,int p)//i,p可以代表很多意义,还有看具体内容。这里可以认为是在初始化树状数组c  ,即在a[i]=p时

                               {

                                          for(;i<=n;i+=i&(-i))

                                                c[i]+=p;

                                 }

                            循环语句中i+=i&(-1)   什么意思,i(&-i)   是求i对应的二进制码其最右面的一代表的数值(不懂得话自己可以求试试)

                            sum(int i)//求和函数

                           {

                                  for(;i>0);i-=i(-i)

                                     S+=c[i];

                               return S;

                             }

    其他的应用在此基础上发挥就行了

  • 相关阅读:
    类属性、实例属性
    多态
    重载
    多继承
    继承介绍以及单继承
    析构
    构造
    self
    方法
    属性
  • 原文地址:https://www.cnblogs.com/orangeblog/p/2199673.html
Copyright © 2011-2022 走看看