树状数组C++详解

news2025/2/27 23:05:27

树状数组介绍

在学习一个算法之前一定要清楚它能干嘛,能解决什么样的问题,对你解题是否有帮助,然后才去学习它!

那么接下来看如下几个问题

什么是树状数组

顾名思义就是一个结构为树形结构的数组,于二叉树的结构类似但又不同,它是在二叉树的结构上删除了一些中间节点,来看两幅图就明白了.

1.这是二叉树的结构

在这里插入图片描述

2.这是树状数组的结构

在这里插入图片描述 

不难发现,树状数组相比于二叉树删除了一些节点,但是为什么要删除呢?这就和树状数组的一些性质(lowbit)有关了,不懂没关系,继续往下看.

树状数组可以解决什么问题呢?

可以解决大部分区间上面的修改以及查询的问题,例如

1.单点修改,单点查询

2.区间修改,单点查询

3.区间查询,区间修改

换言之,线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决,因为线段树的扩展性比树状数组要强.

树状数组和线段树的区别在哪?

 有人会问了既然线段树的问题能够用树状数组解决而且线段树还比树状数组扩展性强,那为什么不直接用线段树呢?问的很好,树状数组的作用就是为了简化线段树,举个例子:一个问题可以用线段树解决写代码半个小时,但是用树状数组只需要10分钟,那么你会选择哪一个算法呢?没错,基于某些简单的问题,我们没必要用到功能性强但实现复杂的线段树(杀鸡焉用宰牛刀).

树状数组的优缺点

优点:修改和查询操作复杂度于线段树一样都是logN,但是常数比线段树小,并且实现比线段树简单

缺点:扩展性弱,线段树能解决的问题,树状数组不一定能解决.

树状数组讲解

前置知识—lowbit(x)运算

如何计算一个非负整数n在二进制下的最低为1及其后面的0构成的数?
例如:44 = ( 101100 ) 2 44=(101100)_244=(101100) 2,最低为1和后面的0构成的数是( 100 ) 2 = 4 (100)_2=4(100) 2=4
所以l o w b i t ( 44 ) = l o w b i t ( ( 101100 ) 2 ) = ( 100 ) 2 = 4 lowbit(44)=lowbit((101100)_2)=(100)_2=4lowbit(44)=lowbit((101100)2)=(100)2 =4

那么lowbit运算时怎么实现的呢?

44的二进制=(101100),我们对44的二进制数取反+1,也即~44+1,得到-44

-44的二进制=(010100),然后我们把44和-44的二进制进行按位与运算,也即按位&得到,二进制000100,也就是十进制的4。所以lowbit(x) = x&(-x)


最后

 本文对鲜果维他命大佬的文章多有借鉴。

原文链接如下:


 

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

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

相关文章

基于SpringBoot+Vue的养老院系统

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、…

【C++初阶】第十一篇:stack和queue的使用与模拟实现

文章目录 stack和queue的介绍和使用stack的介绍stack的定义方式stack的使用 queue的介绍queue的定义方式queue的使用 stack和queue的模拟实现容器适配器stack的模拟实现queue的模拟实现 总结: stack和queue的介绍和使用 stack的介绍 stack的文档介绍 stack是一种容…

文本三剑客之~~~sed命令

目录 sed概念sed 的工作流程:命令格式:常用选项:常用操作: 示例:打印删除替换:插入:剪切复制将字符替换位置 sed概念 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提…

Allegro加密PCB文件

写在前面: 记得以前不知道Allegro可以加密PCB文件的时候,就遇到了尴尬的事情。 其一:要发给别人layout文件,但是又怕别人外传,而且有关于公司文件保密的问题,其实这不论是公事还是私事,如果我…

软测人正在杀死软测行业

前言、一个软件做出来,最不能少的人是谁? 不用说就是开发,因为开发是最了解软件运作的那个人,早期不少一人撸网站或者APP的例子,相当于一个人同时是产品、研发、测试、运维等等,这也是为何开发是地位和上限…

如何一步一步构建网站ChatGPT插件

在本文中,我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件,旨在帮助网站生成一个ChatGPT提示测试题,以巩固当前网页的内容。 1、抽象提取 这个网站ChatGPT插件大概的效果,类比的…

股票量价关系基础知识7----图解各阶段量价关系:价涨量缩

图解各阶段量价关系:价涨量缩 价涨量缩是指股价上涨,成交量却萎缩的一种价量背离走势。它通常反映上涨力道不足,预示股价可能反转向下。 一、上涨初期的价涨量缩 (一)形态分析 股价经过一轮下跌后止跌回升&#xff0c…

Redis中的缓存穿透、雪崩、击穿

概述: 缓存穿透:大量请求根本不存在的key, 应用服务器压力变大缓存雪崩:redis中大量key集体过期,数据库压力变大,服务器崩溃缓存击穿:redis中一个热点key过期(大量用户访问该热点ke…

【Linux】驱动学习,先啃框架

目录 前言: 一、驱动设计 (1)面向对象: (2)分层: (3)分离: 二、驱动框架 (1)传统框架 (2)总线设备驱…

四.从零开始JVM实战高手-JVM监控及线上问题定位

前言 Java程序员面试JVM几乎比问,对于JVM监控,线上OOM,CPU负载100%等问题也是经常被问到,尽管在企业中不一定轮得到我们去处理线上问题,但是不管是为了面试还是为了应对开发那么对于JVM线上问题处理都是必须要去了解的…

二、软件工程——Modeling

1.Undestanding Requirements System Engineering(系统工程) !!!Requirements Engieering(需求建模) 1.Inception(开始):(确认利益相关者) 2.…

164道网络安全工程师面试题(附答案)

为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工程师面试题,一共有164道面试真题,希望它们能够帮助大家在面试中,少走一些弯路、更快拿到offer! 93道网络安全面试题 1、什么是SQL注入攻击 2、什么是XSS…

Linux中的特殊进程:idle进程(0号进程)、init进程(1号进程,被systemd 取代 )、kthreadd进程(2号进程)

文章目录 1. Linux中的三个特殊进程:2. idle进程、init进程、kthreadd进程的创建3 kthreadd进程3.1 kthreadd进程的启动3.2 kthreadd进程创建子进程3.3 kthreadd的工作流程总结 4. init进程4.1 init进程的启动 4. 总结参考 1. Linux中的三个特殊进程: i…

【作者踩坑总结0错版】vscode配置codeql-MacBook(M1/M2芯片-arm)

文章目录 前言一、codeql是什么二、安装必备工具2.1、安装codeql-cli2.2、安装codeql仓库2.3、桌面新建文件夹2.4、安装vscode 三、配置codeql环境变量四、vscode配置codeql插件4.1、下载测试靶场4.2、生成数据库文件(最难最多bug)4.3、vscode配置ql数据…

[入门必看]数据结构5.3:二叉树的遍历和线索二叉树

[入门必看]数据结构5.3:二叉树的遍历和线索二叉树 第五章 树与二叉树5.3 二叉树的遍历和线索二叉树知识总览5.3.1_1 二叉树的先中后序遍历5.3.1_2 二叉树的层次遍历5.3.1_3 由遍历序列构造二叉树5.3.2_1 线索二叉树的概念5.3.2_2 二叉树的线索化5.3.2_3 在线索二叉树…

服务(第十九篇)mysql的备份和恢复

备份的类型: ①物理备份:备份数据库的物理文件,数据文件和日志文件; 冷备份:关闭数据库进行的; 热备份:数据库处于运行中状态,依赖于日志文件; 温备份:数…

Cisco NX-OS Software Release 10.3(3)F - 网络操作系统软件

Cisco NX-OS Software Release 10.3(3)F - 网络操作系统软件 请访问原文链接:https://sysin.org/blog/cisco-nx-os-10/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Cisco NX-OS Cisco NX-OS 操作系统助力网络紧…

Golang中map基础

目录 map类型 声明和初始化 元素操作 大小和容量 并发问题 实现原理 注意 map类型 Go语言中的map类型是一种key-value(键值对)结构,用于存储一组无序的数据,其中键是唯一的,值可以相同或者不同。在Go语言的程序…

button 设置外观

导入图片 设置拉伸 设置按钮的FlatStyle属性为Flat 设置透明背景

先到先得先学,2023最新国内大厂最新Java面试八股文总结

“铜三铁四”接近尾声,身边被迫“毕业”或者主动在这个时间点跳槽的大佬基本该找到工作的都找到工作了,找不到的也大多数都已经躺平了(手动狗头),只剩一群“45度人”(卷不动,躺不平的人&#xf…