线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
如何优化和提升Win10家庭中文版的性能与安全性
家家厨房每天在用!它会释放微塑料,细菌超500亿个......
吃土豆升血糖快?可能是方法错了!2个吃土豆不升糖的技巧,糖尿病人收好
重视健康,不容忽视:深入解析复检艾滋的重要性
KDEF|情感识别数据集|面部表情分析数据集
F12芳纶纤维,军工与民用领域的"超级材料"探秘
一个刷牙时容易漏掉的细节,可能导致口臭!99% 的人都“中枪”了
银行的个人信用报告查询管理对个人信用信息安全的影响?
如何提升驾驶执照等级?这一过程有哪些关键步骤?
心脑血管疾病的中药防治
血钾高可以吃什么水果
论地震与火山爆发的成因
安阳袁林景区游玩攻略:门票、交通、美食与住宿全解析
鸡蛋现货价格的影响因素有哪些?鸡蛋现货价格如何反映市场供求关系?
新手必读:水滴轮参数详解与选购指南
狗狗的呼吸方式与特点(为什么狗狗只用鼻子呼吸?)
抑郁症不能吃什么
呼吸道感染时,这些食物有助于病情恢复
如何在理财黄金现货市场中做出明智决策?这种决策如何适应市场变化?
大数据开发中的ETL:从基础概念到未来趋势
优化数据流程:ETL工程师项目经验与技能提升
每日蛋白的摄入量应该是多少
中国器官捐献日 | 爱的传递,生命的延续
65岁老人可以买什么医疗保险?这份指南请收好
中国茶文化:源远流长的历史、种类与饮用礼仪
《哪吒2》爆火背后:电影投资的新机遇与挑战
酒后蜂蜜水的正确喝法
辽宁有哪些必去的旅游景点推荐?
如何拥有一个好的握杆?你需要知道的7个教练和球员们的握杆共识
卫生间推拉门尺寸及安装步骤详解