线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
平板支撑的标准练法,90%的人都没练对,教你正确姿势,防止腰痛
剖腹产后如何保持良好心态?来自妙佑医疗国际的专业建议
剖腹产后如何科学护理伤口?这份实用指南请收好
剖腹产后沾黏的真相大揭秘!
双十一过后,用徒步治愈剁手后的焦虑
冬季户外活动:摆脱心理阴霾的阳光良方
如何挑选保暖内衣:材质、厚度与工艺详解
冬凌草的功效与作用(冬凌草在农村的名字及其应用)
孕期心理健康:如何缓解焦虑?
权谋背后的悲剧:李斯与赵高的合谋
秦朝第一相李斯:从统一天下到腰斩结局
秦朝的悲剧:秦二世之死背后的赵高与李斯
唐太宗李世民开创了什么样的治世局面
早孕反应会影响宝宝吗?准妈妈的科学应对指南
北京协和医院专家推荐:识别子痫前期,守护母婴安全
超声引导下的星状神经节阻滞:慢性疼痛治疗的新选择
鼻子干得受不了!民间热门法:菜籽油、红霉素软膏能长期用吗|网红说法求真
敲警钟!这些家庭用气安全十分重要!
春季小孩子穿衣不犯愁!5度到15度精准搭配指南
2024人民健康大会:全年龄段眼健康攻略
青光眼患者的心理健康挑战与应对之道
老婆生气了怎么办?15个实用技巧帮你轻松化解矛盾
哈尔滨亚冬会首日战报:中国香港冰壶混双险胜中国台北,中国男子冰球加时憾负韩国
磷酸铁锂助力可再生能源发电:技术优势与应用前景
控糖佳选,高蛋白双粗粮:家庭健康必备,稳糖又营养
如何选择适合自己的保温杯?关键因素与使用建议详解
不锈钢保温杯的材质,简单的给大家做一个介绍。
汽车点烟器电路故障?这些小妙招让你秒变修车达人!
广州七大特色美食:从早茶到煲仔饭,尽显岭南饮食文化魅力
手机怎么拍摄长曝光?2招学会,拍出来好惊艳!