线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
CSDN
1.
https://blog.csdn.net/weixin_74850661/article/details/145394365
基础知识
线段树和树状数组都只是一个工具,题目并不会一下子就告诉你这个题目用到线段树和树状数组,这取决于你想使用的数据结构以及所要优化的方向。
线段树和树状数组(也称为二叉索引树)是两种常用的数据结构,主要用于处理数组的区间查询和更新操作。它们的主要区别如下:
适用场景
- 线段树 :
- 适用于需要复杂区间操作的场景,如区间最大值、区间最小值、区间更新等。
- 适合动态性较强的问题。
# 点的更新
class Tree:
def __init__(self,n):
self.st = [0]*(4*n)
# 当前节点o,当前范围是l,r,需要在索引index,更新值为val
def update(self,o,l,r,index,val):
# l,r 是当前区间的范围,index 是要插入的数据的索引
if l==r:
self.st[o] = val
return
mid = (l+r)//2
if index<=mid:
self.update(2*o,l,mid,index,val)
else:
self.update(2*o+1,mid+1,r,index,val)
self.st[o] = max(self.st[2*o],self.st[2*o+1])
# 当前节点为o,当前的节点为l,r,需要查询的范围是L,R
def query(self,o,l,r,L,R):
if l >= L and r <= R:
return self.st[o]
mid = (l+r)//2
res = 0
if L<=mid:
res = max(res,self.query(2*o,l,mid,L,R))
if R > mid:
res = max(res,self.query(2*o+1,mid+1,r,L,R))
return res
- 树状数组 :
- 适用于简单的前缀和查询和单点更新问题。
- 适合静态或半静态问题,且代码实现更简洁。
特性 | 线段树 | 树状数组 |
|---|---|---|
结构 | 二叉树 | 基于数组的树形结构 |
功能 | 支持复杂区间操作 | 主要用于前缀和查询 |
时间复杂度 | O(log n) | O(log n) |
热门推荐
报到证全攻略:毕业生入职必备,常见问题一次搞定!
大众发动机技术揭秘:EA211系列1.4T和1.5T,谁更可靠?
怎样预防感冒?这几个妙招要知道!
如何选择适合自己的手帐和文具
国产替代加速:光刻机产业链国内厂商梳理
关于汽车充电设计,我们都错了?
南瓜子是生吃好还是熟吃好?从中医角度解析其营养价值与功效
扩散模型+强化学习实战:8篇顶会论文复现+代码开源(附环境配置指南)
人生感悟 怒气、傲气与小气,此三者皆为心性之弊,
【中医药故事】大夫、郎中、太医......古代医生种类趣谈
如何用路由器建立云盘
术锐机器人完成全球首次单孔机器人跨洋远程手术,引领未来医疗新篇章
中科探海新专利:水听器阵列提升清晰度的科技革新
椎动脉供血不足是怎么回事
八大安全管理理论有哪些?
植被覆盖下土壤水分含量反演方法详解
基金入门:基金投资的风险有哪些?
跳楼自杀保险公司赔吗?接到跳楼者电话有责任吗?
研究证实:两种代糖可改善胰岛素敏感性,抑制体重增加
探秘翡翠螭龙与灵芝:揭秘传统文化的深邃寓意
2025年小托福考试时间公布!附备考攻略
约基奇的梦幻脚步:探析篮下转身终结的魔幻绝技
米粥和米饭热量大揭秘:哪个更容易让你胖?
多所高校"强基计划":数学140分以上可破格入围
如何弥补基金亏损以实现资产增值?基金亏损弥补的方法对投资组合有何影响?
U型沟通法:提升客户满意度与忠诚度的有效沟通方式
超长期特别国债发行对债市影响的历史回顾与展望
对AI冲击就业市场的思考
数学高材生优先进名校!10余所985名校强基招生加大破格优惠力度
死刑前大喊我要戴罪立功,能保命吗?看完这个真实案例就明白了