线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
太行水镇:一个充满水乡风情的北方古镇
恋乡·太行水镇:探秘千年古县的文化瑰宝
恋乡太行水镇:周末国潮露营胜地
2024年度十大好剧盘点,这些爆款你追了吗?
吃遍这8样菜,才算没白来湖南长沙
宇树H1“福兮”:机器人如何跳好秧歌?
《秧BOT》:当机器人遇上东北秧歌
鼓浪屿春节免费音乐会预约攻略:12场演出等你来
鼓浪屿八卦楼:电影人带你走进历史光影
直播涉赌会如何判决?一文详解法律判决标准与应对措施
智能信号灯遇上新能源车:城市交通的绿色革命
智能信号灯:城市交通的“最强大脑”
华兴联投获AI信号灯专利,智能交通迎来新突破
从太尉到庶人:《水浒传》中高俅的权力兴衰之路
高俅当上太尉后的真实权力揭秘
东山岛:漳州必打卡的绝美海岛
漳州古城与南靖土楼:闽南文化的双子星
春节必打卡:泉城非遗坊里的地道美食
老济南年俗:腊八粥开启团圆序曲
热干面究竟怎么做才能地道又美味?从选材到调味!
热干面是哪里的特产?
江西十大必吃美食:从米粉蒸肉到三杯鸡
Michael McIntyre教你从电影中学地道英语
悉尼Burwood周末娱乐新宠大揭秘!
Burwood:悉尼华人区的美食天堂
如何使用社保卡进行金融交易?
泰安市智能信号灯升级:230个路口实现“绿波畅行”,交通拥堵显著缓解
株洲市用AI让红绿灯聪明起来!
从蓬莱阁到天津之眼,一路美景不打烊!
烟台到天津自驾游全攻略:避坑指南!