线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
探索短视频矩阵系统的无限可能:创意、互动与转化
如何把源码编译生成apk文件
趣味运动会项目大全:团队协作与个人竞技完美结合
探讨中国医疗行业的挑战与未来发展趋势
诉讼指南之民事诉讼的证据知识
乐清美食排行榜前十名
黄金的定价逻辑:实际利率模型为何会失效?
一块玉牌有什么特殊之处?圭是两周时期的高等级礼器
网络互联设备详解:从中继器到网关
华盖文昌天乙贵人:八字命理中的吉神与贵人
读完3套英文原版桥梁书,阅读量轻松达到15万!
三篇高质量工作总结范文,涵盖项目管理、团队协作等多个维度
文档管理逻辑分析方法有哪些
公司能知道员工浏览的网页吗?六种合理查看浏览记录的方法
长白山天池奔赴之旅
ETF场内和场外有什么区别?解析交易方式、费用及投资策略差异
场内基金交易的时间和规则是什么
云盘上传照片的4大核心步骤,轻松搞定照片存储难题
《破·地狱》:从传统文化智慧中,获得“破”死而向生的温暖
家庭医生教您科学控制糖
2024山东中职学校排行榜:五所优质学校详解
为什么这么多年成功“出海”只有《哪吒》?本地化在影视中的生死密码
饮食调理对鼻炎有帮助吗?
探案丨一针定因:肿大的腮帮子
5个自重训练动作,在家练遍全身肌群,有效延缓衰老
女人深爱你的表现,不是主动约你,和你聊天,而是对你做了这些
开辟戏曲网络传播的新局面
从“狄阁老”到“神探狄仁杰”
虚拟化技术——内存虚拟化
白天嗜睡是怎么回事,如何缓解?