线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
50 Cent暗示《GTA:罪恶都市》影视作品即将上线!
GTA SA:街头文化的启蒙之路
R星黑科技揭秘:GTA V和大表哥2如何诞生?
如果被骗了,应该这样做
消费者风险提示:小心“积分清零”骗局,假兑换,真陷阱!
消费者风险提示:小心“积分清零”骗局,假兑换,真陷阱!
翻译中的伦理问题:如何在不同文化间找到平衡
血脂偏高如何在日常调养?5个不良习惯若改正,降血脂或能更轻松
高血脂和睡觉有关?医生反复强调:血脂高的人,睡觉牢记"3不要"
殷桃46岁如26岁!《时光的秘密》同款护肤法大揭秘
VSCode文件出现只读模式的原因及解决方法
如何在Windows上更改文件的只读属性
如何在Windows上更改文件的只读属性
GTA5:定义开放世界的标杆之作
《GTA V》:现代开放世界的标杆之作
从央视到新舞台:周涛、李思思、刘芳菲的转型之路
周公解梦:梦见栽葱的命运预示
《侠盗猎车手 5》:高手进阶攻略大揭秘!
《侠盗猎车手》中的城市传奇:纽约、迈阿密、洛杉矶的文化之旅
小熊座流星雨来袭!平潭最佳观星指南
平潭壳丘头遗址:南岛语族起源的“东方之珠”
平潭岛“蓝眼泪”,梦幻美景等你来打卡!
平潭岛必去三景:仙人井、北港村、长江澳
周末逃离都市,打卡广州大岭村!
周末打卡大岭村,感受千年古韵
广州大岭村:800年古村的岭南文化之旅
广州大岭村:岭南文化传承的活化石
探访广州唯一“中国历史文化名村”——大岭村
秋冬养生新宠:车前草创意食谱大揭秘!
秋冬养生新宠:车前草泡茶