线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
决胜幽门螺杆菌:4大特殊人群的根除治疗方案,专家深度解读
幽门螺旋杆菌5问:从检测到治疗的专业解答
如何在银行了解金融监管政策的变化?
散光和近视的区别:从定义到矫正方式的全面解析
头痛伴随口干舌燥的可能原因是什么
十类常见的灭火器种类有哪些 常用的灭火器有哪几种
脚面脚骨折手术拆线后多久能喝酒
加班值班和出差的利弊分析及应对策略
“8杯水”到底是多少?喝水这件小事,很多人都没做对
三方协议的作用及签订注意事项
什么是三方协议
威海环山快速路二期设计方案获专家一致认可
战国双陵:马陵之战与桂陵之战的历史对比
PS5沉浸感爆棚!这些单机神作让你紧握手柄不想放下
六味地黄丸:三类体质人不能服用
本科阶段如何寻找和参加科研项目
工作被辞退的梦:梦到工作被人辞退的感受和启示
老年人心脑血管饮食指南:低盐低脂高纤维,这些食物最健康
高考体测不过怎么办?会影响毕业和填报志愿吗?
台儿庄古城:一座融合八种建筑风格的“活着的古运河”
为改造火星,他们提出一项就地取材的大胆计划
从"头"做起 幸"盔"有你——"一盔一带"交通安全知识宣传
欧洲工资排名大起底,西班牙工资也太低了!
民间老钓手传承:四种传统钓法详解
认识家庭关系中的亲属角色
马拉松成绩一直无法提高?试下这5点,跑出新PB并不难!
为什么说扶苏不懂他爹秦始皇?2分钟看完这段令人惋惜的父子情!
有机农业中的除草方法,你知道多少?
宝宝取名 音韵起名方法漫谈
磁又有新形态了?科学家发现交错磁性!