线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
长期失眠,身体会发生哪些变化?对健康有什么影响?
反映元素性质的两个重要数据—电离能与电负性
高度数白酒能消毒吗
陈著《春雪》:在歌咏春雪的同时,道出一个朴素的自然哲理
《本杰明·巴顿奇事》:一部关于时间、生命与爱情的哲学电影
美国媒体发布NBA历史最佳阵容:库里 邓肯入选!有争议吗?
详解历史十大前锋排名:邓肯无悬念登顶,诺天王超越马龙跻身前三
品种图鉴 | 超全大花绣球品种合集,13个大类,超200个品种
绣球花种植环境和管理养护方法?
清朝庞大疆域的形成与维持,背后有什么原因存在?
初中物理运动学知识有哪些(初中物理运动学知识有哪些内容)
《猴王出世》:孙悟空的诞生
智齿是怎么拔的?智齿拔牙流程图分享,看完相信医生就对了
总想讨好别人是“讨好型人格”吗?看专家怎么说→
检验科三大常规中常见的医保违规行为
揭秘抑郁症:症状、成因与治疗
甲氧氯普胺使用指南:这些细节需谨慎
探索未来视界,元梦MR智能眼镜引领技术革新
“食品添加剂”如洪水猛兽?你可能存在这些认知误区!
高分辨率MiniSAR影像处理方法综述
淋浴房的面积怎么算?装修达人教你精准测量
整形医生张耐洋:面部皱纹的分类与改善方法详解
行业准入条件是什么?满足这些条件对企业发展有哪些重要性?
梦见自己得癌症了:解梦与心理分析
5G的优势和劣势
北戴河全面旅游攻略:必去景点推荐与最佳路线指南
法院管理制度研究
全国防治碘缺乏病日丨懂“碘”知识更健康(附食物含碘量名单)
韶关乐昌:智慧政务助力养老认证,暖心服务惠及千家万户
增加免疫力的食物:这些发酵食品,竟能在三天内增强免疫效果?