线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
厂长如何带领企业打造超强文化?
龙洋王音棋加盟,2025春晚主持阵容大揭秘
倪萍的春晚传奇:从青涩到定海神针
儿童饮食误区大揭秘:营养与禁忌的平衡
宝宝一岁内饮食禁忌清单:这些食物不能吃!
在家也能做出餐厅级牛排:从选材到摆盘的完整攻略
《暗区突围》:莫辛纳甘配置攻略,农场男团刷新规律揭秘
《暗区突围》农场地图武器选择攻略
《暗区突围》新手必选神器:M4A1、AK74N和MP5
牛肉配菜食譜有哪些驚豔選擇?
铁棍山药和怀山药有什么区别?温县铁棍山药的滋补优势
铁棍山药能减肥吗?
儿童喝姜茶竟有4大好处!提高抗病力多喝也无妨
职场礼仪升级:从问候开始
职场礼仪升级:从握手到鞠躬,你get了吗?
糖尿病肾功能衰竭的人能吃哪些食物
波斯艺术之光:15幅令人惊叹的细密画
绿叶制药抗抑郁新药纳入医保,国产创新药迎来突破
陆林院士:抑郁症患病率持续攀升,创新治疗带来新希望
郑州抑郁医院专家:社交活动是抑郁症治疗的重要辅助手段
李玟走了,但抑郁症康复路还在
顺产妈妈的黑芝麻滋补指南:4款简单食谱助力产后恢复
科学坐月子:顺产妈妈的营养调理全攻略
发挥乡贤文化在乡村振兴中的作用
【乡贤助力家乡发展】刘林华:情系故里 反哺桑梓
“乡”约清远阳城,共绘发展蓝图
蒙古旅游攻略:13个实用贴士助你畅游草原国度
避免抗菌素耐药性,幽门螺旋杆菌感染有了替代治疗方案
顺产还是剖腹产?医生这样建议
产前心理护理,助你自然分娩无忧