C++数据结构【树状数组】

news2024/10/5 17:16:40

树状数组

  • 什么是树状数组?
    • 树状数组和线段树的区别
  • 树状数组的结构
  • 什么是lowbit
    • lowbit如何计算
      • 代码实现:
          • 补充知识——&,|,^运算
            • &
            • |
            • ^
            • 注意:
  • 树状数组的基本操作
    • 单点修改
            • while循环版代码
            • for循环版代码
    • 单点查询
    • 区间修改
    • 区间查询
  • 树状数组的性质

什么是树状数组?

树状数组是类似线段树的一个数据结构,支持单点修改、查询,区间修改、查询等操作,当你用查分TLE时,你就可以用树状数组解决。

树状数组和线段树的区别

树状数组代码简单适合用于简单一点的题目,而线段树结构复杂,代码较长,用于难题更为方便。

树状数组的结构

树状数组形似二叉树,却不是树形结构,其本质在于它每一个节点的的父节点,不是根据当前节点编号/2或除以2-1来确定的(注:这是二叉树的性质),而是通过计算lowbit值来确定(下文会讲到含义及计算方法)。

元素个数为8的序列的树状数组结构呈现是这样的:

请添加图片描述

什么是lowbit

lowbit是树状数组中计算一个节点指向另外哪一个节点的函数。就如图1号节点指向的是2号节点是因为1的lowbit值为2,而6号节点指向8号节点是因为6的lowbit值为8.

lowbit如何计算

很简单,只需要计算一下x&-x就行了。

举个例子:6

6的二进制编码为1110,而它的反码(即-6的二进制)为1001,进行&运算得:1000,即8的二进制编码。

代码实现:

int lowbit(int x) {
  return x & -x;
}

补充知识——&,|,^运算
&

当遇到两个二进制数数(若不是二进制数就转换为二进制数)分别比较每一位,若都为1,则结果为1,否则结果为0.

|

若两个数中,有一个数为1,结果为1,否则为0。

^

即|的逆运算(取反),也就是,若两个数中,若有一个数为,结果为0,否则为1

注意:

以上运算最好是二进制数或bool类型,若不是,请先转换。

树状数组的基本操作

单点修改

单点修改非常简单,只要把包含了这个节点的所有节点都修改就行了。

while循环版代码
void add(int x, int k) {
  while (x <= n) {
    c[x] = c[x] + k;
    x = x + lowbit(x);
  }
}
for循环版代码
void add(int x, int k) {
  for(int i = x; i <= n; i+=lowbit(i){
  	c[i] = c[i] + k;
  }
}

因为我们已知每个点的父节点编号都是它的lowbit值,所以我们每次只用加lowbit,就可以轻松获取父节点编码。

单点查询

区间修改

区间查询

区间查询可以近似看做算前缀和。

int getsum(int x) {  // a[1]..a[x]的和
  int ans = 0;
  while (x > 0) {
    ans = ans + c[x];
    x = x - lowbit(x);
  }
  return ans;
}

树状数组的性质

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest生成 junit-xml 测试报告

pytest 生成junit-xml 测试报告&#xff0c;那么生成的xml报告有什么用呢&#xff1f;可以集合一些持续集成工具&#xff08;如jenkins…等&#xff09;方便查看报告。 junit-xml 测试报告 命令行参数有2个跟 junit-xml 报告相关的参数 --junit-xmlpath create junit-xm…

2023年软件测试——精选金融银行面试真题

1、P2P你们也测试后台管理吗&#xff1f;个人芝麻信用积分是调取哪里的资料&#xff1f; 测试后台管理&#xff1a; 后台也测&#xff0c;但是我主要测试前台&#xff0c;我的关注点是前台&#xff0c;后台只是拿来用&#xff0c;能配合前台正常走完流程就行。 后台主要对前…

Linux线程同步(下)

文章目录 1. POSIX信号量2. 基于环形队列的生产消费模型2.1 代码实现2.1.1 构造函数和析构函数2.1.2 生产和消费2.1.3 测试 3. 线程池3.1 成员变量3.2 构造和析构3.3 push和pop3.4 启动线程池3.5 测试 4. 将线程池改成单例模式5. STL、智能指针和线程安全6. 其他常见的各种锁6.…

聊聊测试驱动开发

这是鼎叔的第六十四篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 本文观点参考自Lasse Koskela&#xff0c;他是《测试驱动开发的艺术》的作者。…

软件测试之【单元测试、系统测试、集成测试】

一、单元测试的概念 单元测试&#xff08;Unit Testing&#xff09;是对软件基本组成单元进行的测试&#xff0c;如函数&#xff08;function或procedure&#xff09;或一个类的方法&#xff08;method&#xff09;。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff0…

揭秘跨部门沟通的秘密武器:让不归你管的人主动配合你的绝妙方法!

跨部门沟通&#xff0c;Edge对此有点胆怯&#xff1a;“我们自己内部进度&#xff0c;怎么着都好管。都是自己人&#xff0c;目标一致。可涉及跨部门合作&#xff0c;管起来就困难。人家又不归我们管&#xff0c;不可控因素太多了。如果在合作的过程中&#xff0c;出现啥问题&a…

docker 镜像结构原理

目录 参考文档&#xff1a;第八篇&#xff1a;Docker镜像结构原理_Linux运维开发的技术博客_51CTO博客 1、基础镜像 base base 镜像有两层含义&#xff1a; 为什么我们的镜像文件比一般的软件小一些呢&#xff1f; 二、镜像的分层结构 问什么 Docker 镜像要采用这种分层结…

org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping

一、yml解析异常问题 今天启动某开源项目时&#xff0c;碰到一个问题org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping 。 二、解决 2.1 修改项目目录下缩进格式 在项目下的nacos目录中application-common.yml 文件中修改缩进格式&#xff0c;每…

15个最好的性能测试工具(软件测试工程师必备)

在软件测试日常工作中&#xff0c;大家接触得比较多的性能测试工具有LoadRunner和Jmeter&#xff0c;这里整理了web应用程序性能和负载压力能力的最广泛使用的性能测试工具的综合列表。 这些负载测试工具将确保您的应用程序在高峰流量和极端压力条件下的性能。 该列表包括开源…

Spring Security OAuth2.0(五)-----OAuth2实现自定义统一认证登录页/自定义授权页/基于mysql存储数据

本次实例涉及三个项目 核心项目工程unify_authorization_server(认证授权登录) 资源服务器项目unify_resource_server 测试项目是前面几篇写的项目 这里没有改动直接用来测试实例项目 &#xff08;一&#xff09;unify_authorization_server pom相关依赖 我采用的是spring-bo…

Ngnix网站服务

Ngnix网站服务 Ngnix网站服务 一、Ngnix服务基础&#xff1a;1.Ngnix的基本概述&#xff1a;2.简述Nginx和Apache的差异&#xff1a;3.Nginx和Apache的优点&#xff1a;4.应用场景&#xff1a;5.扩展&#xff1a; 二、编译安装Ngnix服务&#xff1a;1.编译安装&#xff1a;2.常…

基于matlab使用自校准来适应阵列不确定性(附源码)

一、前言 此示例显示了基于约束优化过程的自校准过程。利用机会来源同时估计阵列形状的不确定性和来源方向。此示例需要优化工具箱。 理论上&#xff0c;可以设计一个完美的均匀线性阵列&#xff08;ULA&#xff09;来执行各种处理&#xff0c;例如波束成形或到达方向估计。通常…

玩转ChatGPT:回答审稿人问题

一、写在前面 前段时间一篇时间序列预测的文章返修&#xff0c;还挺幸运的&#xff0c;给了个小修。 不过问题也问得有点刁钻&#xff0c;应该是个行家。 想到手头有小Chat&#xff0c;打算使用TA来辅助我回答审稿人问题。 以下展示仅仅提供一个工作流和思路&#xff0c;具体…

好程序员:逼自己看完并学会,你的Java会很牛!

打算学java的伙伴们&#xff0c;如果你们很迷茫焦虑的话&#xff0c;不妨看看好程序员的建议。好程序员作为行内人告诉大家&#xff0c;零基础也是可以学java的&#xff0c;而且不仅可以学会&#xff0c;还可以学的很好&#xff0c;并且能找到工作。 Java学习路线规划&#xff…

Day22 实战篇 ——Jmeter性能测试实战——JMeter执行原理、Jmeter性能测试实战、下载使用PerfMon插件、 Grafana可视化展示

Day22 实战篇 ——Jmeter性能测试实战——JMeter执行原理、Jmeter性能测试实战、下载使用PerfMon插件、 Grafana可视化展示 文章目录 Day22 实战篇 ——Jmeter性能测试实战——JMeter执行原理、Jmeter性能测试实战、下载使用PerfMon插件、 Grafana可视化展示一、Jmeter执行原理…

高性能通信库——nanomsg(含交叉编译)

一、nanomsg介绍 NanoMsg是一个Socket的通讯库&#xff0c;使用C语言编写实现的&#xff0c;这样就可以适用于多种操作系统&#xff0c;而且几乎不需要什么依赖&#xff0c;可扩展并且能易于使用。Nanomsg提供了几种常见的通信模式 &#xff08; 也称为“可扩展性协议” &#…

Flutter 小技巧之 InkWell Ink 你了解多少

今天要介绍一个「陈年」小技巧&#xff0c;主要是关于 InkWell 的基础科普&#xff0c;InkWell 控件相信大家不会陌生&#xff0c; 作为 Flutter 开发中最常用的点击 Widget &#xff0c;配合 Flutter 自带的 Material &#xff0c;可以轻松实现带有水波纹等的点击效果。 而之所…

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器&#xff1a;配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址&#xff1a;官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…

如何使用 PowerPoint 2021 制作演示文稿?

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 引言 PowerPoint 是一款非常常用的演示文稿制作工具&#xff0c;它可以帮助您创建漂亮的幻灯片&#xff0c;展示您的想法和信息。如果您是 PowerPoint 的新手&#xff…

xx客滑块

xx客滑块 网址流程1、访问首页&#xff0c;得到网页源代码得到 sessionId2、生成dInfo参数&#xff08;getInfoTp接口使用到&#xff09;&#xff0c;是AES 加密&#xff08;不校验&#xff09;3、访问 /captcha/getInfoTp 得到responseId &#xff08;可以认为是图片id&#x…