首页 > 其他分享 >树状数组学习总结

树状数组学习总结

时间:2023-05-25 22:25:54浏览次数:33  
标签:总结 10 树状 color lowbit int 数组

今天本初中生蒟蒻学习了一下\(\color{red}{树状数组}\),总结一下~~~

树状数组的实现

功能简介

  • 快速求前缀和(\(\color{purple}{O(log_2n)}\))
  • 修改某一个数(\(\color{green}{O(log_2n)}\))

树状数组图示

树状数组其实就是如图所建立的~~~

下面引入一个函数——lowbit

lowbit(x)是x的二进制表达式中最低位的1所对应的值。

例如:

  1. \(lowbit(6)\)
    6的二进制为\((110)_2\),\(lowbit(6)=(10)_2=2\)
  2. \(lowbit(8)\)
    8的二进制为\((1000)_2\),\(lowbit(8)=(1000)_2=8\)
$\color{blue}{代码点这里!}$
int lowbit(int x)
{
    return x & -x;
}

知道这个函数之后,我们再来看这张图~~~
对于第一行的数字,\(\color{green}{lowbit之后都等于(1)_2}\)
对于第二行的数字,\(\color{red}{lowbit之后都等于(10)_2}\)
对于第三行的数字,\(\color{purple}{lowbit之后都等于(100)_2}\)
\(\dots\)

这就是这张图的神秘之处~~~

快速求前缀和

我们再来观察这张图

如果我们想求\(C_8\)
那么\(C8=A_8+C_7+C_6+C_4\)
然后我们看一下这3个数7,6,4
\(\color{orange}{7-lowbit(7)(1)=6}\)
\(\color{pink}{6-lowbit(6)(10)=4}\)

综上所述:
\(\color{red}{C_x=C_{x-lowbit(x)} + C_{x-lowbit(x) - lowbit(x-lowbit(x))+\dots+A_x}}\)

$\color{green}{代码点这里!}$
int sum(int x)
{
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) res += tr[i]; //tr为我们的树状数组

    return res;
}

修改某一个数

还是这张图~~~

假如我们要修改的是C1,让他加上10
那么我们看一下他需要更新的点:\(C_1,C_2,C_4,C_8,C_{16}\)
再来看看他们的性质:
\(\color{orange}{1+lowbit(1)(1)=2}\)
\(\color{pink}{2+lowbit(2)(10)=4}\)
\(\color{green}{4+lowbit(4)(100)=8}\)
\(\color{blue}{8+lowbit(8)(1000)=16}\)

综上所述:\(\color{red}{对于每一个C_{x+lowbit(x)}都加上所要增加的数},注意:x每次让其等于x+lowbit(x)\)

$\color{brown}{代码点这里!}$
void add(int x, int val) //val为要加上的值
{
    for (int i = x; i <= n; i += lowbit(i)) tr[i] += val; //tr是树状数组
}

标签:总结,10,树状,color,lowbit,int,数组
From: https://www.cnblogs.com/Tiny-konnyaku/p/Fenwick-Tree.html

相关文章

  • 今日总结
    今天报告作为学生会的一员,今天上午跟着查了宿舍卫生。中午写了互联网+的项目计划书,上体育课,体育课考试没考好因为下周三就要考试了,数据库原理与应用,所以现在在复习代码时间:0h代码行数:0行博客数量:0篇......
  • 2023.5.10周三每日总结
     异步处理Android应用程序中,获取网络数据需要使用异步任务的方式,以避免界面卡顿、假死等。在AS中,我们可以使用异步任务或Handler来避免程序挂起。深入了解异步处理,可以更好的掌握跨线程间的数据处理。......
  • 2023.5.15周一每日总结
    这周老师为我们讲解了人机交互设计像我们说明了合理的设计的重要性通过带我们分析茶壶的组成,和茶壶茶嘴等拼接在一起的方式的不同,像我们说明一个合理的ui的重要性错误示例: 我们说软件工程终究是和人打交道的行业,我们需要满足用户的要求 而要做到这一点,我们需要有很强的......
  • 2023.4.26周三每日总结
    Activity的生命周期Activity生命周期是一个非常重要的概念,理解Activity的生命周期对于开发Android应用程序至关重要。在AS中,Activity有始有终,可以选择对应状态的回调函数,根据状态完成一些逻辑操作。学习Activity的生命周期,可以更好的掌握应用程序的启动、销毁、状态保存等操作......
  • 关于软件构造第二部分(PPT4-8)的总结复习
    一、基本数据类型、对象数据类型基本数据类型:int、long、boolean、double等,——有值,无ID,无法区分,不可变,在栈中分配内存,代价低;对象数据类型:String、Date等——有值,有ID,可为可变也可为不可变,在堆中分配内存,代价昂贵;可将基本数据类型包装为动态数据类型(首字母变大写)通常在定义集合......
  • 2023.5.1周一每日总结
    虽然今天是劳动节,但我依旧进行了Android的学习今天所学习的内容是intentIntentIntent是在不同Activity、应用程序之间传递信息的途径。在AS中,我们可以使用Intent来启动另一个Activity或应用程序,也可以传递数据到其他程序。学习Intent,可以更好地掌握跨应用程序间的通信。在An......
  • 2023.5.6周六每日总结
    网络连接Android应用程序最广泛的使用之一是网络通信。为了在AS中进行网络通信,可以使用Java的URL和HttpURLConnection或者像Volley等框架库。学习网络连接可以实现调用API接口,获取服务器端资源等。api接口调用大多数在虚拟机中不会出现太多的问题,但在手机上实际使用安卓时会......
  • 2023.4.22周六每日总结
    控件使用控件就是Android应用程序中各种元素,如按钮、文本框、显示列表等等。学习使用控件是Android开发的基础,它是许多程序界面的桥梁。在AS中,通过拖拽、代码编写等方式添加或修改控件,并通过属性面板修改控件的属性。在这里的学习中为了使按钮能发挥我想要的作用,进行了多次调......
  • 将一个数组逆序输出
    将一个数组逆序输出。#include<stdio.h>#defineN10intmain(){inta[N]={0,1,2,3,4,5,6,7,8,9};inti,t;printf("原数据为:\n");for(i=0;i<N;i++){printf("%d",a[i]);}for(i=0;i<N/2;i++){t=a[i];a[i]=a[......
  • 总结20230525
    代码时间(包括上课)2h代码量(行):50行博客数量(篇):2篇相关事项:1、今天上午进行了校级卫生大检查,我们班整体来说表现不错,有三个宿舍被评为了优秀宿舍,其余的宿舍也得到了好评。2、今天上午查完卫生后,和队友出去买了比赛相关的东西,周六就开始比赛了。3、今天下午进行的是羽毛球课的考......