线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
数学建模综合评价模型与决策方法
社保断缴还能享受医保吗
现在流行的婚礼形式有哪些
陆游《游武夷山》:诗中描绘的壮丽景色与人生理想
周末为什么总过得这么快 时间感知的奥秘
唐朝灭亡后的大分裂时代,混乱的五代十国究竟怎么回事?一文就能了然于胸!
孩子睡不好?讓孩子安心入眠的秘訣
维特根斯坦的语言哲学:他如何重新定义语言与现实的关系
冷冻冷藏一体柜怎么调温度
印度宗教:多元性与统一性的完美融合
如何评估人工智能发展趋势中的风险与机遇?
深度解析商鞅变法:他究竟做了什么,为何是弱小的秦国统一六国?
泻药和止泻药可以一起吃吗?医生的专业解答
濑户内国际艺术祭:北川富朗如何让艺术与在地文化相遇
金钱树叶子变黄的原因及解决方法
吃夜宵 vs 饿着睡,哪个危害更大?
成年人最有水平的说话方式(很现实)
戏里夫妻戏外知己,时隔34年,揭开赵雅芝和叶童之间的不为人知
热水器如何保养,一年清洗几次?
一文看懂LoRa和LoRaWAN技术原理及优缺点详解
2024年度招聘计划制定指南:三个关键维度提升人才储备效能
赚钱第一步,先努力停止打工
Excel中输入5分之3的多种方法详解
如何进行关键词聚类并提高你的SEO排名?
烟台山火出圈“流量密码”何在
阿根廷通胀预测大幅下调,“休克疗法”能否让阿根廷走出经济困境?
红曲的作用与功效有哪些
银湖沙龙综述|第210期:《尤里西斯》赏析
李雅普诺夫稳定性分析
男生一般长到几岁停止长高