线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
手麻背后暗藏风险:三种疾病信号需警惕
春节:凝聚家庭与社会的文化纽带
冬季儿童发热,正确用药指南
对乙酰氨基酚和布洛芬,你真的会用吗?
扑热息痛怎么吃才最有效?这份用药指南请收好
帕皮提:法属波利尼西亚的文化瑰宝
帕皮提:大溪地文化的瑰宝
雨季打卡!帕皮提的芙泰瓦瀑布壮观揭秘
江门中山公园:一座城市的纪念与传承
中山到江门旅游路线大揭秘!🔥
跟着非遗游六安|六安市“传承+发展+宣传”燃起非遗新活力
北京两日游:打卡网红景点!
秋冬养生新宠:白茅根食谱大揭秘!
秋冬养生神器:白茅根了解一下?
夏日清凉必备:白茅根特色食疗大揭秘!
白茅根:中医推荐的养生神器?
秋冬养生必备:白茅根的功效与应用
水培巴西木怎么养殖才能更旺盛(巴西木水培需要的条件和注意事项)
巴西木水培与养护完全指南
巴西木泡水不生根?原因及解决方法
经进地仙丹:一颗传承千年的养生明珠
腊月二十四,大扫除迎新春!
全家总动员:春节大扫除攻略
我家的春节大扫除:一场辞旧迎新的传统仪式
贾立群:中西医结合是肿瘤治疗创新的突破口
打卡紫禁城,品尝正宗北京烤鸭
故宫、天安门、颐和园:北京两天一夜文化探秘!
北京两日游必打卡:故宫+天安门+颐和园
北京两天一晚摄影打卡攻略:故宫到国贸CBD
北京故宫:两天一夜的文化盛宴