线段树与树状数组

实用工具系列 - Xshell安装下载与使用 一、介绍 二、下载 三、安装 四、使用 阅读详情

树状数组

优点:代码短,运行效率高(大部分情况下与线段树相比大约差10倍),支持修改(在线做法)
能用树状数组做的尽量别用线段树(杀鸡不用牛刀)
解决问题:动态快速求前缀和(O(logn))

  1. 给某个位置上的数加一个数(单点修改)
  2. 快速求前缀和(区间查询)

个人理解:
在某些情况下,需要实现对序列中进行区间增加(差分能做到),之后再进行查询(前缀和能做到),但是前缀和是离线的不支持修改,而差分又不能很快的求出区间和,因此引出了这种方法。

构造方法:

  1. 维护一个和原数组a[n]一样长的数组(注意这里下标是从1开始的)
  2. 一共有四层,根据每个下标二进制表示数字的末尾有几个0代表第几层
  3. 例如其中奇数位置的值都等于原数组c[奇数] = a[奇数],因为它们的末尾有0个0,代表这都是第0层
  4. c[x]其实表示的是下标为(x - 2^k,x]这个区间的和,其中k为x的二进制末尾0的个数,2^k可以用lowbit(x) = x&-x表示

请添加图片描述

例题代码:
leetcode307. 区域和检索 - 数组可修改

class NumArray {
public:
    vector<int> tr;
    vector<int> num;
    int lowbit(int x)
    {
        return x&-x;
    }

    void add(int val,int idx)
    {
        for(int i = idx;i<tr.size();i+=lowbit(i))
        {
            tr[i] += val;
        }
    }

    int query(int idx)
    {
        int sum = 0;
        for(int i = idx;i>0;i-=lowbit(i))
        {
            sum += tr[i];
        }
        return sum;
    }


    NumArray(vector<int>& nums):tr(nums.size()+1),num(nums) {
        
        for(int i = 0;i<nums.size();i++)
        {
            add(nums[i],i+1);
        }
    }
    
    void update(int index, int val) {
        add(val - num[index],index+1);
        num[index] = val;
    }
    
    int sumRange(int left, int right) {
        return query(right + 1) - query(left);
    }
};

线段树

Orange3实战教程:文本挖掘---标注语料库地图 Oreange3,文本挖掘,标注语料库地图用于在二维投影中可视化、聚类文档,并用关键词进行标注。 阅读详情

相关推荐

自建智能算力中心与第三方算力租赁的深度分析

自建智算中心和第三方算力租赁的主要区别如下:对比维度自建算力中心第三方算力租赁初期成本数千万至数亿元硬件采购+机房基建零硬件投入,按需付费(如1元/卡时)部署速度6-12个月(采购、部署、调试)即时开通,分钟级资源调度运维难度需专业IT团队,承担断电、故障等风险服务商全托管,SLA保障99.95%可用性弹性扩展扩容需重新采购硬件,周期长、成本高支持秒级弹性伸缩,应对流量峰值技术迭代硬件更新周期长,易被淘汰自动升级。

2501_90999758的博客 2361

树状数组与线段树

这里写自定义目录标题树状数组含义与原理线段树实现,累加与改变数值 树状数组 含义与原理 与部分位置和的一种方法,拥有前缀和快速取得结果的特点(O(2logn)),也拥有普通枚举快速修改的优势(O(logn))。 以数组的形式模仿树,一般用于维护前缀和,算法复杂度与线段树相同,但由于是数组,且线段树保存的是区间,面对过大的数据,无法解决,故树状数组能解决的问题线段树也能,线段树能解决的问题,树状数组不一定可以。 以这张图为例:A数组为原始数组 C数组为树状数组。 C【i】=A【i-2^k+1】+A【i-2

m0_52103105的博客 396

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 451

树状数组和线段树

树状数组 树状数组的优点是能在O(logn)的时间复杂度之内解决两类问题: 1.在数组的某个位置上的数加上一个数(单点修改) 2.快速求前缀和(区间查询) 如果用一般的算法,在修改某个数之后,再求前缀和,那么包含这个数的前n个数的前缀和都要进行改变,时间复杂度就从O(1)变成了O(n)。 再者如果同时进行单点修改(时间复杂度为O(n))和区间查询(时间复杂度为O(1)),平均下来就是O(n)/2,即O(n),而用树状数组来做因为时间复杂度都是O(logn),所以平均下来就是O(logn)。 树状数组也是一个

gutianyu12138的博客 1233

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

STM32H7 FOC控制时序优化与PWM中点更新策略

在永磁同步电机(PMSM)的磁场定向控制(FOC)系统中,控制时序精度是决定电流环带宽、观测器收敛性与动态响应能力的基础要素。其核心在于理解PWM生成、ADC采样与控制计算三者之间的硬件级时间耦合关系——尤其在中心对齐模式下,标准更新机制引入的半周期延迟会破坏电压-电流瞬时映射,导致滑模观测器失配与高频相位滞后。通过将PWM更新事件绑定至重复计数器(RCR)清零点,可实现控制指令在开关周期中点生效,使等效电压矢量中心与计算时刻严格对齐。该策略显著提升系统确定性,为20 kHz以上高频电流环提供物理支撑,并广

flink9streamer的博客 859

树状数组&线段树

树状数组:顾名思义,用数组来模拟树形结构。 树状数组可以解决的问题:区间上的更新以及求和问题。以**o(logn)**获得任意(区间)前缀和 树状数组可以解决的问题都可以用线段树解决,那么区别在于,树状数组的系数要少很多。 优点:修改和查询的复杂度都是o(logN),而且比线段树系数要少很多,比传统数组要快,而且容易写。 缺点:遇到复杂区间问题还是不能解决,功能有限。 咱们的二叉树: 用数组建立树,黑色为原来的数组,红色代表我们的树状数组。 c为树状数组(红色),黑色为原来的数组A 管辖长度为从i向前,管

qq_41646522的博客 1060

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1125

树状数组与线段树的应用

分析:根据输入方式,可以把二维变为一维,可以把样例模拟一下,(把4,5纵向压倒第一层,也就是最下边这一层)每次输入星星时,根据x数组,把该星星之前的星星都加上就行,这样就可以把问题转化为求前缀和,又因为该题需要一边输入星星,一边求·该星星的值,所以不能用朴素的求前缀和问题,朴素前缀和问题时间复杂度时O(n)的,所以需要树状数组来求。图上有的点表示只有这个点的值,比如奇数都只表示自己的点,因为奇数的二进制最后一位都是1,偶数表示若干个点的和,比如8表示5~8的和。

m0_63925226的博客 754

Python对象的基本组成和内存示意图及引用的本质

在Python中,变量也称为:对象的引用(reference)。变量存储的就是对象的地址。变量不需要显式声明类型。根据变量引用的对象,Python解释器自动确定数据类型。一个内存块,拥有特定的值,支持特定类型的相关操作。变量位于:栈内存(压栈出栈等细节,后续再介绍)。⚠️Python是动态类型语言。变量通过地址引用了“对象”。

Calor13的博客 557

零基础学写《扫雷》游戏(Qt扫雷源码)

扫雷游戏是在windows系统中自带的游戏,他的游戏玩法其实很简单,20世纪初期电脑上没有啥游戏可以玩,所以扫雷游戏也算是当时是最常火爆的一个电脑游戏。以下文章详细介绍扫雷游戏的实现。实现语言为C++。

啊渊的专栏 1万+

线段树和树状数组的认识与总结

线段树(Segment Tree)和树状数组(Binary Indexed Tree)具有相似是结构特点,都是以二叉树作为基础进行数据运算,都是擅长处理区间上的数,不同的是线段树的每个节点维护的是对应区间的最小值,所以善于处理区间上的最小值,而树状数组的节点维护的是对应区间的数的和,所以更善于处理区间和。 线段树的主要操作为2种:1、给定s和t,求其区间上的最小值;2、给定i和x,把ai的值改成

优快云_Coder_T的博客 1782

Python3+PCAN-USB基于PCAN-Basic二次开发实现上位机功能

一、环境搭建 1.概述 本文主要是通过Python3与CAN总线工具PCAN-USB基于官方PCAN-Basic库实现CAN总线消息读写功能。 2.PCANBasic.py和PCANBasic.dll下载地址 https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip 3.Python安装 下载地址:https://www.p...

测试领域技术分享 5186

线段树和树状数组

一、线段树和树状数组的区别 线段树可以在O(log(N))时间复杂度内寻找区间极值和区间和,线段树的创建时间复杂度为O(log(N)),空间复杂度为O(>=2n-1);树状数组可以在O(log(N))的时间复杂度内计算区间极值和区间和,树状数组的创建时间复杂度为O(Nlog(N)),空间复杂度为O(N)。线段树求解的区间是任意的,越界也无所谓,但是树状数组求解的区间必须是从1开始的合法区间。 二、线段树   线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个

t_zht的博客 6250

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++ 线段树,树状数组

ps:本文需要读者对递归和回溯,位运算的补码,位与操作以及前缀和有一定了解。后面在写到的时候会做简单介绍。 结构介绍: 树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。 线段树是一个二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(lo

weixin_43899008的博客 3225

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

树状数组 + 线段树

假设 x=2 ^ i [k] + 2 ^ i [k - 1] + 2 ^ i [k - 2] + ... + 2 ^ i [1] , i [k] >= i [k - 1] >= i [k - 2] >= ... >=i[1]则c[ 1 ]=1 , c[ 3 ]=3 , c[ 5 ]=5 , c[ 7 ]=7 , c[ 9 ]=9 , c[ 11 ]=11 , c[ 13 ]=13 , c[ 15 ]=15 ,1. 原数组a变成差分数组b---求a[l~r]+c ---> b[ l ] += c;

2303_80098652的博客 1089

树状数组与线段树入门

区间问题:树状数组与线段树入门

Maximum_Mighty_X的博客 691

树状数组+线段树

树状数组+线段树 树状数组 动态求连续区间和 数星星 线段树 动态求连续区间和 数列区间最大值

小羊的博客 1374

线段树与树状数组的区别

作者:闵梓轩 链接:https://www.zhihu.com/question/54746883/answer/151823936 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 假设数组长度为n。 线段树和树状数组的基本功能都是在某一满足结合律的操作(比如加法,乘法,最大值,最小值)下,O(logn)的时间复杂度内修改单个元素并且维护区间信息

honghuidan的博客 7995
上一篇: IDEA创建MVN项目
下一篇: 从问题出发深入理解“卷积”
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值