• 模板【Binary Indexed Tree树状数组】


    PART1(算法思想简介)

    1.实现

     线段树的区间是按照中间点划分的,而树状数组是根据 lowbit 来划分的。

    对于结点i,其表示的区间是[i-lowbit(i)+1,i]。

    计算过程显而易见。

    2.时间复杂度

    3.特别优势

    4.适用情况

    5.需要注意的点

    6.函数、变量名的解释+英文

    7.dalao分析

    a.如何知道这个结点是那一层的lowbit(从而可以知道他包含了多少个结点)?他等于x(不含2为因数)*2^y,就表明他包含了2^y个结点

    b.如何找到最大的lowbit?

    for(int m=1, l=0; m < n; m<<=1, ++l);//m表示当前包括了多少的数,l表示2^l次个数,最终答案是会比n大的

     c.lowbit的意义:那么定义一个函数lowbit,这个函数的值是i的二进制表达式中最低位的1所对应的值。

    PART2(算法各种类型(并附上代码))

    #include <iostream>
    using namespace std;
    const int maxN_ = 110;
    int n;
    class Binary_Index_Tree_ {
      public:
      int c[maxN_];
      int Lowbit(int x) { return x & (-x); }
      int GetSum(int x) {
        int res = 0;
        for (int i = x; i > 0; i -= Lowbit(i)) {
          res += c[i];
        }
        return res;
      }
      void UpDate(int x, int val) {
        for (int i = x; i <= n; i += Lowbit(i)) {
          c[i] += val;
        }
      }
    }bit;
    int main() {
      cin >> n;
      for (int i = 1; i <= n; ++i) {
        int val;
        cin >> val;
        bit.UpDate(i, val);
      }
      int q;
      cin >> q;
      while (q--) {
        int l, r;
        cin >> l >> r;
        cout << bit.GetSum(r) - bit.GetSum(l - 1) << endl;
      }
      return 0;
    }
    /*
    5
    1 2 3 4 5
    3
    1 5
    2 3
    4 4
    */

    PART3(算法的延伸应用)

    PART4(对算法深度的理解)

    PART5(与其相关的有趣题目)

     

  • 相关阅读:
    《吊打面试官》系列-缓存雪崩、击穿、穿透
    WebGL学习之纹理贴图
    小试小程序云开发
    关于socket.io的使用
    动画函数的绘制及自定义动画函数
    canvas实现俄罗斯方块
    Redis集群
    手工搭建基于ABP的框架
    手工搭建基于ABP的框架(3)
    手工搭建基于ABP的框架(2)
  • 原文地址:https://www.cnblogs.com/bear-xin/p/15015622.html
Copyright © 2020-2023  润新知